perl中的奇怪事情';s值函数

perl中的奇怪事情';s值函数,perl,Perl,我得到以下警告: 在数据行1的C:\tools\test.pl第17行的串联(.)或字符串中使用未初始化的值 但是下一行的\uuuuu数据将在没有任何警告的情况下进行处理,并获得以下信息: test1b.txt:testtest1c.txt:test:test 更奇怪的是,当我添加一行时:print“$line:.$”。“\n”警告消失了 有人有线索吗 #!/usr/bin/perl -w use strict; my $pattern='test'; my $output='$&';

我得到以下警告:

在数据行1的C:\tools\test.pl第17行的串联(.)或字符串中使用未初始化的值

但是下一行的
\uuuuu数据将在没有任何警告的情况下进行处理,并获得以下信息:

test1b.txt:testtest1c.txt:test:test

更奇怪的是,当我添加一行时:
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
#/usr/bin/perl-w
严格使用;
我的$pattern='test';
我的$output='$&';
while()
{
咀嚼;
我的$line=$\ux;
chomp($line);
$line=~/$pattern/;
#打印“$line:.$&.\n”#为什么取消注释这一行会使下一行在没有警告的情况下通过。
my$result=“$行:”.eval($output)。“\n”;
打印$result;
}
__资料__
test1a.txt
test1b.txt
test1c.txt

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

在程序中的任何地方使用此变量[
$&
]都会造成相当大的影响 所有正则表达式匹配的性能损失。为了避免这种情况 惩罚,您可以使用
@-
提取相同的子字符串。启动 在Perl5.10中,您可以使用
/p
匹配标志和
${^match}
变量对特定的匹配操作执行相同的操作


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

这一点很好!我很少用“eval”。一些链接提供了有关其用法的更多概念,例如。