这是我的剧本:
use strict;
use warnings;
while (<>) {
/(@.*)/;
print $`;
}
它执行正确 - 在匹配之前打印所有内容 - 但我明白了:
Use of uninitialized value $` in print at FindAdd.pl line 6, <> line 1.
Use of uninitialized value $` in print at FindAdd.pl line 6, <> line 2.
Use of uninitialized value $` in print at FindAdd.pl line 6, <> line 3.
Use of uninitialized value $` in print at FindAdd.pl line 6, <> line 4.
当然,如果我不使用警告,我可以避免这种情况,但我想知道是否有更好的方法来避免警告。 $`必须初始化吗?
答案 0 :(得分:6)
将测试移至条件中。如果它不匹配,那么$ PREMATCH变量将是未定义的。
use strict;
use warnings;
while (<>) {
if (/(\@.*)/) {
print $`;
}
}
另外,为了清楚你的意图,我会逃避@。这样,其他人会更快地将其作为文字阅读,而不是想知道这是否是一个数组。
答案 1 :(得分:4)
每个匹配变量仅由成功的正则表达式匹配设置(并且仅被清除)。否则,它们的值将从之前成功的正则表达式匹配中遗留下来。
看起来你正试图在@
(电子邮件地址可能?)之前匹配这些东西。那么为什么不这样做呢?
if (/(.*?)@/) {
print $1;
}
不要使用具有性能副作用的$`
,$&
和$'
。或者,您可以使用Perl v5.10中引入的/p
标记,该标记的每个匹配版本为${^PREMATCH}
,${^MATCH}
和${^POSTMATCH}
。这些内容记录在perlvar。
如果我正在执行此任务,我会找到类似Email::Address的内容,它可以了解特殊情况和格式。