如何使数字警告致命?

Håk*_*and 6 perl

我无法使数字警告致命:

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)

我缺少什么?

ike*_*ami 8

将变量转换为数值后,该转换就会被缓存。这意味着$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)