我在使用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$
答案 0 :(得分:4)
如果要在Perl中编码,请使用Net::Whois等模块。搜索CPAN以获取更多此类处理网络的模块。如果你只想使用没有模块的Perl,你可以试试这个(注意你不必再使用egrep / awk了,因为Perl有自己的grepping和字符串操作工具)
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 :(得分:1)
在Perl中使用awk最简单(但不是最顺畅)的方法是a2p
。
echo 'your awk script' | a2p
答案 2 :(得分:0)
正如其他人所提到的,反引号是插值的,因此它会在$
上跳闸。你可以将它们全部转义,或者你可以使用单引号:
open my $pipe, "-|", q[whois google.com | egrep ... |head -n1];
my $result = join "", <$pipe>;
close $pipe;
这利用了open
打开管道的能力。 -|
表示文件句柄$pipe
应附加到命令的输出。这里的主要优点是你可以选择你的引用类型,q[]
相当于单引号而不是内插,所以你不必逃避。
但是天哪,将一个awk脚本粘贴到Perl中有点愚蠢和脆弱。要么使用像Net :: Whois这样的模块,要么在Perl中进行whois抓取,可能会利用Email :: Find这样的东西,或者只是将它写成bash脚本。你的Perl脚本在Perl中的表现并不多。