我無法使數字警告致命:
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";
輸出是:
Argument "a" isn't numeric in numeric gt (>) at p.pl line 6.
P1
y = a
Done
預期輸出:
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.
我錯過了什么?
uj5u.com熱心網友回復:
將變數轉換為數值后,該轉換將被快取。這意味著在第一個之后$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";
輸出:
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.
我們可以通過 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513183.html
標籤:perl
上一篇:如何格式化bashSED/AWK/Per輸出以進行進一步處理
下一篇:Perl正則運算式命名組陣列