我在 Perl 5.10.1 上运行了以下脚本:
#!/usr/bin/perl
use strict;
use warnings;
foreach( my $x =0 ; $x < 1; $x++) { # Line 5
print_line(); # Line 6
}
sub print_line {
print "Function call from line: " . [caller(0)]->[2] . "\n";
}
尽管对子例程的调用来自第 6 行,但脚本仍输出 C 样式 for 语句开头的行号:
Function call from line: 5
真正奇怪的是,如果我将一个随机语句放入 C 风格的 for 循环中的一个空白行中,caller
返回正确的行号:
#!/usr/bin/perl
use strict;
use warnings;
foreach( my $x =0 ; $x < 1; $x++) {
my $x = 3;
print_line(); # Line 7
}
sub print_line {
print "Function call from line: " . [caller(0)]->[2] . "\n";
}
上面的脚本正确输出:
Function call from line: 7
这是某种错误还是我可以做些什么来获得caller
准确报告行号?
我认为这可能是一个错误,因为如果您替换,则不会发生相同的行为
foreach (my $x = 0 ; $x < 1 ; $x++) {
with
foreach my $x (0 .. 0) {
我不明白exactly发生了什么,但是通过比较两个不同版本的 opttree,我认为nextstate
op 没有得到适当的优化。我的版本有
<;> nextstate(main 4 lineno.pl:11) v:*,&,x*,x&,x$,$ ->8
作为 的左兄弟entersub
调用的操作print_line
,而你的有
<0> ex-nextstate v ->8
它已从执行流程中取出。
将其写为perlbug http://p3rl.org/perlbug.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)