perl的eval函数中的奇怪之处

时间:2013-06-07 06:08:23

标签: 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

1 个答案:

答案 0 :(得分:10)

Perl认为$&$'$`代价昂贵,因此它实际上不会在不使用它们的程序中填充它们。来自perlvar联机帮助页:

  

在程序中的任何地方使用此变量[$&]都会产生相当大的影响   所有正则表达式匹配的性能损失。为了避免这种情况   惩罚,您可以使用@-提取相同的子字符串。开始   使用Perl 5.10,您可以使用/p匹配标记和${^MATCH}   变量为特定的匹配操作做同样的事情。

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