2

谢谢你的阅读。

对于 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 命令不起作用。

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

4

2 回答 2

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()获取 url 的对象,为什么需要使用wget?您也可以在 Perl 中执行此操作。

于 2012-06-22T14:26:29.877 回答
2

你要这个:

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

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

顺便说一下,Perl 的qq()运算符可能会让您感兴趣。你可以查查看。

于 2012-06-22T14:24:29.937 回答