对于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命令不起作用。
这就是问题所在,如何解决烦人的语法
答案 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()
运营商可能会对您感兴趣。你可以查一查。