LINUX.ORG.RU

нид хелп по перлу или альтернатива с авк-ом


0

0

нужно сделать на перле прмерон вот такое на авк-е...
awk '/:.:/(FS="-->"){print $1"\n"$2}'
вот чего достиг, но не работает
#!/usr/bin/perl
#use warnings;
use strict;
my @arr;
while(@arr= split(/\-->/,<stdin>)){
# if(/:.:/) {
print "$_";
#print @arr[1];
#print @arr[2];

#}

}
собственно нужно на перле ибо альтернатива с использованием авк-а что-бы можно было математические действия не тормозно выполнять.

anonymous

Тупо в лоб:

$ echo "aaa --> :9:" | awk '/:.:/(FS="-->"){print $1"\n"$2}' 
aaa
-->
$ echo "aaa --> :9:" | perl -ne 'if(/:.:/) { split /(-->)/; print "$_[0]\n$_[1]". "\n" }'
aaa 
-->
$

anonymous
()

awk '/:.:/(FS="-->"){print $1"\n"$2}' 
          ^^^^^^^^^^ - а это что здесь делает?

man a2p

$ echo '/:.:/(FS="-->"){print $1"\n"$2}' | a2p
#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
                        # this emulates #! processing on NIH machines.
                        # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
                        # process any FOO=bar switches

$[ = 1;                 # set array base to 1
$FS = ' ';              # set field separator
$, = ' ';               # set output field separator
$\ = "\n";              # set output record separator

while (<>) {
    chomp;      # strip record separator
    @Fld = split($FS, $_, -1);
    print $_ if /:.:/;if (($FS = '-->')) {
        print $Fld[1] . "\n" . $Fld[2];
    }
}

sdio ★★★★★
()
Ответ на: комментарий от sdio

> awk '/:.:/(FS="-->"){print $1"\n"$2}'

> ^^^^^^^^^^ - а это что здесь делает?

Кастомный разделитель полей. В awk он может быть любым регэкспом, а в perl-овских онлайнерах только символом. Поэтому, видать, и сложности возникли у топикстартера.

> man a2p

Облажалась утилитка:

> print $_ if /:.:/;if (($FS = '-->')) { print $Fld[1] . "\n" . $Fld[2]; }

epic fail

anonymous
()
Ответ на: комментарий от anonymous

>(FS="-->")

Что такое FS я знаю. 
Вопрос почему оно в таком месте определено?
каждая строка awk - это:
             pattern   { action statements }
или
              function name(parameter list) { statements }



sdio ★★★★★
()
Ответ на: комментарий от anonymous

По-идее оно должно было быть таким:

$ echo 'BEGIN {FS="-->"} /:.:/ {print $1"\n"$2}' | a2p
#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
                        # this emulates #! processing on NIH machines.
                        # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
                        # process any FOO=bar switches

$FS = ' ';              # set field separator
$, = ' ';               # set output field separator
$\ = "\n";              # set output record separator

$FS = '-->';

while (<>) {
    chomp;      # strip record separator
    ($Fld1,$Fld2) = split($FS, $_, -1);
    if (/:.:/) {
        print $Fld1 . "\n" . $Fld2;
    }
}

sdio ★★★★★
()
Ответ на: комментарий от sdio

> Что такое FS я знаю. 
Вопрос почему оно в таком месте определено?

Видать с этой строки он хочет поменять сепаратор. И это работает, как
 ни странно.

$ for i in `seq 1 2`; do echo ":$i: x:$i:"; done | gawk '/1/(FS="x"){print "<<"$1">><<"$2">>"}'
<<:1:>><<x:1:>>
<<:2: >><<:2:>>


anonymous
()
Ответ на: комментарий от sdio

$FS = ' ';

while (<>) {  
    if (/:.:/) {
        split $FS;
        $FS = '-->';
        print "$_[0]\n$_[1]";
    }
}

anonymous
()
Ответ на: комментарий от sdio

Не, все же не работает. 

$ for i in `seq 1 5`; do echo ":$i: x:$i:"; done | gawk '/3/(FS="x"){print "<<"$1">><<"$2">>"}'
<<:1:>><<x:1:>>
<<:2: >><<:2:>>
<<:3: >><<:3:>>
<<:4: >><<:4:>>
<<:5: >><<:5:>>

FS меняется на х уже на первой же строчке, хотя регэксп там не 
срабатывает. Т.е. это такой странный  BEGIN_AFTER_1ST_LINE. 
Зачем это может пригодиться - теряюсь.

anonymous
()
Ответ на: комментарий от trapezoid

       When an ERE token appears as an expression in any context other than as the right-hand of the '~' or "!~" operator or  as  one  of
       the built-in function arguments described below, the value of the resulting expression shall be the equivalent of:


          $0 ~ /ere/

trapezoid
()
Ответ на: комментарий от anonymous

Я "кагбэ" намекаю, что мануалы читать надо, а не искать эффекты медного купороса.

trapezoid
()

man perlintro и вопрос решен

// www_linux_org_ru

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.