Как я могу использовать Awk внутри скрипта Perl? - PullRequest
2 голосов
/ 19 апреля 2010

У меня проблемы с использованием следующего кода внутри моего скрипта Perl, любые советы действительно приветствуются, как исправить синтаксис?

# If I execute in bash, it's working just fine

bash$ whois google.com | egrep "\w+([._-]\w)*@\w+([._-]\w)*\.\w{2,4}" |awk ' {for (i=1;i<=NF;i++) {if ( $i ~ /[[:alpha:]]@[[:alpha:]]/ )  { print $i}}}'|head -n1

contact-admin@google.com

#-----------------------------------

#but this doesn't work 

bash$ ./email.pl google.com
awk:  {for (i=1;i<=NF;i++) {if (  ~ /[[:alpha:]]@[[:alpha:]]/ )  { print }}}
awk:                              ^ syntax error

# Here is my script
bash$ cat email.pl 
####\#!/usr/bin/perl         


$input = lc shift @ARGV;

$host = $input;

my $email = `whois $host | egrep "\w+([._-]\w)*@\w+([._-]\w)*\.\w{2,4}" |awk ' {for (i=1;i<=NF;i++) {if ( $i ~ /[[:alpha:]]@[[:alpha:]]/ )  { print $i}}}'|head -1`;
print my $email;

bash$

Ответы [ 3 ]

4 голосов
/ 19 апреля 2010

используйте такой модуль, как Net :: Whois , если вы хотите кодировать на Perl. Поищите на CPAN больше таких модулей, связанных с сетью. Если вы хотите использовать только Perl без модуля, вы можете попробовать это (обратите внимание, что вам больше не нужно использовать egrep / awk, так как Perl имеет свои собственные средства поиска и манипуляции со строками)

   open(WHOIS, "whois google.com |")    || die "can't fork whois: $!";
   while (<WHOIS>) {

       print "--> $_\n";  # do something to with regex to get your email address
   }            
   close(WHOISE)                      || die "can't close whois: $!";
1 голос
/ 19 апреля 2010

Самый простой (хотя и не самый гладкий) способ использования awk внутри Perl - a2p.

echo 'your awk script' | a2p
0 голосов
/ 19 апреля 2010

Как уже упоминалось, обратные тиканы интерполируются, поэтому их срабатывание происходит на $. Вы можете избежать их всех, или вы можете использовать одинарные кавычки, например:

open my $pipe, "-|", q[whois google.com | egrep ... |head -n1];
my $result = join "", <$pipe>;
close $pipe;

Это использует способность open открыть трубу. -| указывает, что файловый дескриптор $pipe должен быть присоединен к выводу команды. Основным преимуществом здесь является то, что вы можете выбрать тип цитирования, q[] эквивалентен одинарным кавычкам и не интерполирован, поэтому вам не нужно избегать вещей.

Но, боже, вставлять сценарий awk в Perl довольно глупо и хрупко. Либо используйте такой модуль, как Net :: Whois, либо выполните очистку whois в Perl, возможно, воспользовавшись такими вещами, как Email :: Find, или просто напишите его как скрипт bash. Ваш Perl-скрипт мало что делает в Perl в том виде, в каком он есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...