Home > OS >  How to make numeric warning fatal?
How to make numeric warning fatal?

Time:10-06

I am not able to make the numeric warning fatal:

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";

Output is:

Argument "a" isn't numeric in numeric gt (>) at p.pl line 6.
P1
y = a
Done

Expected output:

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.

What am I missing?

CodePudding user response:

Once you convert a variable to numeric, that conversion is cached. This means that $y is numeric after the first $y > 0, so the second neither warns nor dies.

Modified test:

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";

Output:

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.

We can see this caching with Devel::Peek. pIOK indicates an integer value is contained. (It's found in the IV slot.) pNOK indicates a floating point value is contained. (It's found in the NV slot.)

$ 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
  •  Tags:  
  • perl
  • Related