gpt4 book ai didi

perl - perl 的 eval 函数中的奇怪事情

转载 作者:行者123 更新时间:2023-12-04 17:23:03 27 4
gpt4 key购买 nike

我收到以下警告:

"Use of uninitialized value in concatenation (.) or string at C:\tools\test.pl line 17, DATA line 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

最佳答案

Perl 考虑 $& , $' , 和 $`是昂贵的,所以它实际上不会在不使用它们的程序中填充它们。来自 perlvar联机帮助页:

The use of this variable [$&] anywhere in a program imposes a considerable performance penalty on all regular expression matches. To avoid this penalty, you can extract the same substring by using @-. Starting with Perl 5.10, you can use the /p match flag and the ${^MATCH} variable to do the same thing for particular match operations.



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

关于perl - perl 的 eval 函数中的奇怪事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977353/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com