Perl 的 caller() 函数返回错误的行号

2024-06-18

我在 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,我认为nextstateop 没有得到适当的优化。我的版本有

<;> 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(使用前将#替换为@)

Perl 的 caller() 函数返回错误的行号 的相关文章

随机推荐