5

我收到以下警告:

“在 C:\tools\test.pl 第 17 行,DATA 第 1 行的连接 (.) 或字符串中使用未初始化的值。”

但是下一行将在__DATA__没有任何警告的情况下被处理并得到这些:

test1b.txt:测试 test1c.txt:测试:测试

更奇怪的是,当我添加一行时:print "$line:".$'."\n";警告消失了。

有人有一些线索吗?

#!/usr/bin/perl -w
use strict;
my $pattern='test';
my $output='$&';
while(<DATA>)
{
    chomp;
    my $line=$_;
    chomp($line);
    $line=~/$pattern/;
    #print "$line:".$&."\n";   #why uncommenting this line make the following line pass without no warning.
    my $result="$line:".eval($output)."\n";
    print $result;
}

__DATA__
test1a.txt
test1b.txt
test1c.txt
4

1 回答 1

10

Perl 认为$&, $', 和$`很昂贵,因此它实际上不会在不使用它们的程序中填充它们。从perlvar手册页:

在程序的任何地方使用这个变量 [ $&] 都会对所有正则表达式匹配造成相当大的性能损失。为避免这种惩罚,您可以使用 提取相同的子字符串@-。从 Perl 5.10 开始,您可以使用/p匹配标志和${^MATCH} 变量对特定的匹配操作执行相同的操作。

但是,当您只在传递给的字符串中使用它们时eval,Perl 无法判断您正在使用它们,因此它不会填充它们,因此它们将是未定义的。

于 2013-06-07T06:15:57.167 回答