我无法使数字警告致命:
use feature qw(say);
use strict;
use warnings;
my $y = "a";
if ($y > 0) {
say "Should not happen";
}
say "P1";
{
say "y = $y";
use warnings FATAL => qw(numeric);
if ($y > 0) {
say "Should not happen";
}
}
say "Done";
Run Code Online (Sandbox Code Playgroud)
输出是:
Argument "a" isn't numeric in numeric gt (>) at p.pl line 6.
P1
y = a
Done
Run Code Online (Sandbox Code Playgroud)
预期输出:
Argument "a" isn't numeric in numeric gt (>) at p.pl line 6.
P1
y = a
Argument "a" isn't numeric in numeric gt (>) at p.pl line 13.
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
将变量转换为数值后,该转换就会被缓存。这意味着$y
是第一个之后的数字$y > 0
,因此第二个既不会发出警告,也不会终止。
修改后的测试:
use feature qw(say);
use strict;
use warnings;
my $y = my $z = "a";
if ($y > 0) {
say "Should not happen";
}
say "P1";
{
use warnings FATAL => qw(numeric);
if ($z > 0) {
say "Should not happen";
}
}
say "Done";
Run Code Online (Sandbox Code Playgroud)
输出:
Argument "a" isn't numeric in numeric gt (>) at a.pl line 6.
P1
Argument "a" isn't numeric in numeric gt (>) at a.pl line 12.
Run Code Online (Sandbox Code Playgroud)
我们可以使用 Devel::Peek 来查看这个缓存。pIOK
表示包含一个整数值。(它位于槽中IV
。)pNOK
表示包含浮点值。(它可以在NV
插槽中找到。)
$ perl -MDevel::Peek -we'my $y = "a"; Dump( $y ); 0+$y; Dump( $y );'
SV = PV(0x56336a2a3ea0) at 0x56336a2d2d00
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x56336a2db600 "a"\0
CUR = 1
LEN = 10
COW_REFCNT = 1
Argument "a" isn't numeric in addition (+) at -e line 1.
SV = PVNV(0x56336a2a2220) at 0x56336a2d2d00
REFCNT = 1
FLAGS = (POK,IsCOW,pIOK,pNOK,pPOK)
IV = 0
NV = 0
PV = 0x56336a2db600 "a"\0
CUR = 1
LEN = 10
COW_REFCNT = 1
Run Code Online (Sandbox Code Playgroud)