Perl 变量中存储的内容与使用方式之间存在差异。您是正确的,乘以 1 会强制将变量用作数字。它还导致将数字存储在SV
向解释器表示变量的数据结构中。您可以使用该Devel::Peek
模块查看 Perl 存储在每个变量中的内容:
use Devel::Peek;
my $num = "8.5";
Dump $num;
输出:
SV = PV(0xa0a46d8) at 0xa0c3f08
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0xa0be8c8 "8.5"\0
CUR = 3
LEN = 4
继续……
my $newnum = $num * 1;
Dump $num;
Dump $newnum;
输出:
SV = PVNV(0xa0a46d8) at 0xa0c3f08
REFCNT = 1
FLAGS = (PADMY,NOK,POK,pIOK,pNOK,pPOK)
IV = 8
NV = 8.5
PV = 0xa0be8c8 "8.5"\0
CUR = 3
LEN = 4
SV = NV(0x9523660) at 0x950df20
REFCNT = 1
FLAGS = (PADMY,NOK,pNOK)
NV = 8.5
我们关心的属性是PV
(字符串指针)、NV
(浮点数)和IV
(整数)。最初,$num
只有字符串值,但将其用作数字(例如在乘法中)会导致它存储数值。但是,$num
仍然“记住”它是一个字符串,这就是为什么Data::Dumper
将它视为一个字符串。
对于大多数目的,不需要显式强制将字符串用作数字,因为运算符和函数可以以最合适的形式使用它们。==
例如, and运算符将!=
其操作数强制转换为数字形式以进行数字比较。使用eq
orne
代替强制进行字符串比较。这是始终use warnings
在您的 Perl 脚本中的另一个原因,因为尝试将非数字字符串与 进行比较==
将获得以下警告:
Argument "asdf" isn't numeric in numeric eq (==) at -e line 1.