我收到以下警告:
“在连接(。)中使用未初始化的值或在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
答案 0 :(得分:10)
Perl认为$&
,$'
和$`
代价昂贵,因此它实际上不会在不使用它们的程序中填充它们。来自perlvar
联机帮助页:
在程序中的任何地方使用此变量[
$&
]都会产生相当大的影响 所有正则表达式匹配的性能损失。为了避免这种情况 惩罚,您可以使用@-
提取相同的子字符串。开始 使用Perl 5.10,您可以使用/p
匹配标记和${^MATCH}
变量为特定的匹配操作做同样的事情。
但是,当您只在传递给eval
的字符串中使用它们时,Perl无法告诉您正在使用它们,因此它不会填充它们,所以它们将是未定义的。