perl的eval函数中的奇怪之处

use*_*304 5 perl

我收到以下警告:

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

但下一行将在__DATA__没有任何警告的情况下处理并得到以下信息:

test1b.txt:test test1c.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
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 10

Perl认为$&,$'并且$`价格昂贵,所以它实际上不会在不使用它们的程序中填充它们.从perlvar联机帮助页:

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

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