Perl wget引用了语法问题

时间:2012-06-22 14:19:59

标签: perl wget

谢谢你的阅读。

对于wget的shell命令,这样的方法有效:

wget -q -O - http://www.myweb.com | grep -oe '\w*.\w*@\w*.\w*.\w\+' | sort -u

但是,当我尝试在Perl程序中插入该命令时,我得到一个语法错误,指的是“找到运算符期望的反斜杠,找到运算符期望的裸字”。所以我用这个{}替换了正则表达式周围的引号,但是,它的作用就像评论它一样,它不会带来错误,但就好像正则表达式不是这样,所以显然花括号是一个错误的尝试。

这是代码,它在foreach中:

foreach(@my_array) {

$browser->get($_);
# and here below is where the error comes
system ('wget -q -O -"$_" | grep -oe '\w*.\w*@.\w*.\w\+' | sort -u');

如果我用{}替换包装正则表达式的单引号,那么wget会获取URL,但grep命令不起作用。

这就是问题所在,如何解决烦人的语法

2 个答案:

答案 0 :(得分:4)

您在系统调用中使用单引号'。他们没有为您填写变量。 $_未被替换。此外,grep旁边的单引号会使这种语法无效。

请改为尝试:

system ("wget -q -O - $_ | grep -oe '\w*.\w*\@.\w*.\w\+' | sort -u");

您还可以使用qq运算符:

system ( qq( wget -q -O - $_ | grep -oe '\w*.\w*\@.\w*.\w\+' | sort -u) );

另外,请查看perlop.


另一个想法:如果您的$browser对象可以get()该网址,为什么需要使用wget?您也可以在Perl中执行此操作。

答案 1 :(得分:2)

你想要这个:

system ("wget -q -O -\"$_\" | grep -oe '\\w*.\\w*@.\\w*.\\w\\+' | sort -u");

您可以在双引号中包含您喜欢的内容,只需要转义某些字符。

顺便提一下,Perl的qq()运营商可能会对您感兴趣。你可以查一查。