gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:22:51 25 4
gpt4 key购买 nike

我在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以准确报告行号?

最佳答案

$ perl -MO=Concise a.pl
j <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 6 a.pl:5) v:*,&,{,x*,x&,x$,$ ->3
5 <2> sassign vKS/2 ->6
3 <$> const[IV 0] s ->4
4 <0> padsv[$x:3,5] sRM*/LVINTRO ->5
6 <0> unstack v* ->7
i <2> leaveloop vK/2 ->j
7 <{> enterloop(next->b last->i redo->8) v ->e
- <1> null vK/1 ->i
h <|> and(other->8) vK/1 ->i
g <2> lt sK/2 ->h
e <0> padsv[$x:3,5] s ->f
f <$> const[IV 1] s ->g
- <@> lineseq vK ->-
- <@> scope vK ->b <---
- <0> ex-nextstate v ->8 <---
a <1> entersub[t5] vKS/TARG,2 ->b
- <1> ex-list K ->a
8 <0> pushmark s ->9
- <1> ex-rv2cv sK/2 ->-
9 <#> gv[*print_line] s/EARLYCV ->a
c <1> preinc[t2] vK/1 ->d
b <0> padsv[$x:3,5] sRM ->c
d <0> unstack v ->e
a.pl syntax OK

正在进行一些优化。 scope被认为是不必要的,已被优化。 (请注意,“ -”表示从未达到。)

但与此同时,这删除了 nextstate op,它设置了警告和 caller的行号。

因此,这是由于优化不当而导致的错误。

关于perl - Perl的caller()函数返回错误的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28652593/

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