Perl中未初始化的值$`

时间:2013-12-22 04:52:27

标签: regex perl

这是我的剧本:

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.

当然,如果我不使用警告,我可以避免这种情况,但我想知道是否有更好的方法来避免警告。 $`必须初始化吗?

2 个答案:

答案 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的内容,它可以了解特殊情况和格式。