gpt4 book ai didi

perl - 为什么 Perl 在这个警告消息中提供了一个误导性的行号?

转载 作者:行者123 更新时间:2023-12-04 02:40:27 25 4
gpt4 key购买 nike

我已经隔离了一个案例,其中 Perl 在警告消息中提供了一个非常具有误导性的行号。我在 Strawberry Perl 5.16.3 中测试了以下内容。

use strict;
use warnings;

my $choice = 0;

while ($choice == 0){

#This is not numeric
$choice = '5,6,7';

if ($choice eq '-4'){
print "This isn't going to happen\n";
}
}

当您运行它时,您将收到警告消息 Argument "5,6,7" isn't numeric in numeric eq (==) at example.pl line 11 .但是第 11 行对应于行 if ($choice eq '-4'){这不可能导致此警告消息,因为它不包含数字比较。

看起来实际发生的事情是 Perl 前进到下一个比较, while ($choice == 0){ ,但用于警告消息的行计数器不前进。

使这种特殊情况变得更糟的是,由于“坏”比较是循环条件,因此它实际上远离提供的行。在我的(简化前)脚本中,它与提供的行号相距数百行。

这是一个错误还是只是解析器的一个不幸限制?

最佳答案

存储每个操作符实例的位置会很昂贵。作为妥协,Perl 只跟踪语句的位置。它通过在每个语句的开头添加一个位置设置操作码来实现。 if statement 是在 $choice == 0 之前启动的最后一条语句已执行,因此将警告报告为来自该行。

$ perl -MO=Concise,-exec a.pl
1 <0> enter
2 <;> nextstate(main 3 a.pl:4) v:*,&,{,x*,x&,x$,$
3 <$> const[IV 0] s
4 <0> padsv[$choice:3,12] sRM*/LVINTRO
5 <2> sassign vKS/2
6 <;> nextstate(main 4 a.pl:6) v:*,&,{,x*,x&,x$,$ <--- Location set to line 6
7 <{> enterloop(next->k last->p redo->8) v <--- Start of while loop
l <0> padsv[$choice:3,12] s <--- $choice == 0
m <$> const[IV 0] s
n <2> eq sK/2
o <|> and(other->8) vK/1
8 <;> nextstate(main 6 a.pl:9) v:*,&,x*,x&,x$,$
9 <$> const[PV "5,6,7"] s
a <0> padsv[$choice:3,12] sRM*
b <2> sassign vKS/2
c <;> nextstate(main 6 a.pl:11) v:*,&,x*,x&,x$,$ <--- Location set to line 11
d <0> padsv[$choice:3,12] s <--- Start of if statement
e <$> const[PV "-4"] s
f <2> seq sK/2
g <|> and(other->h) vK/1
h <0> pushmark s
i <$> const[PV "This isn't going to happen\n"] s
j <@> print vK
k <0> unstack v
goto l <--- Jump back to loop expr
p <2> leaveloop vKP/2
q <@> leave[1 ref] vKP/REFC
a.pl syntax OK

这是一个已知的限制。我不知道他们为什么不简单地放一个 nextstate循环表达式中的 op。

关于perl - 为什么 Perl 在这个警告消息中提供了一个误导性的行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50651331/

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