Perl中的数字和字符串之间存在自动转换。
来自Llama的书:
你不必担心 数字与数字的区别 串;只需使用正确的 运营商,Perl将全力以赴 工作
如果你担心的话 效率,不要。 Perl一般 记得转换的结果 所以它只完成了一次。
这是怎么回事?我的意思是Perl如何记住它以及多少时间?
即使只是一个位,它不会影响效率吗?
答案 0 :(得分:13)
效率为何要慢?
如果您自动或手动进行转换,则完全相同。但是通过自动执行,您只需输入更少的代码。
perl中的标量变量可以包含许多不同的值。运行时(perl解释器)执行转换并将数字保存在标量内。
您可以使用Devel::Peek
查看此类内部内容#!/usr/bin/env perl
use Devel::Peek;
my $value = '15';
Dump($value);
$value + 5;
Dump($value);
$value = 5;
Dump($value);
输出:
SV = PV(0x8f71040) at 0x8f82d88
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x8f7ecb8 "15"\0
CUR = 2
LEN = 4
SV = PVIV(0x8f7a2fc) at 0x8f82d88
REFCNT = 1
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 15
PV = 0x8f7ecb8 "15"\0
CUR = 2
LEN = 4
SV = PVIV(0x8f7a2fc) at 0x8f82d88
REFCNT = 1
FLAGS = (PADMY,IOK,pIOK)
IV = 5
PV = 0x8f7ecb8 "15"\0
CUR = 2
LEN = 4
在这里你可以看到一个标量值(SV)的字符串为"15"
为(PV),在添加之后它会添加(IV)(整数值)。
标量包含一个标志,以确定哪个值是正确的。在第一个转储中,您会看到标记POK
,其中PV
是正确的当前值。如果您要求此值,perl
可以立即返回此值。
添加后,您会看到“IOK”表示“IV”值也可以。实际上变量本身并没有改变,但是因为perl需要添加一个字符串才能进行从字符串到int的对话。添加后您看到的内容是POK
和IOK
有效。这意味着Scalar当前拥有一个有效的字符串和一个有效的Integer。只要变量没有改变,两个值都是有效的,并且perl不需要进行对话。
但是在将值更改为整数5
之后,您会看到“POK”不再设置。此操作将IV设置为新值并使PV值无效。只要您使用$value
作为整数,就不会发生任何其他事情。只要您在字符串上下文中使用$value
,就会转换为字符串,并会更新PV
并设置POK
。但只需要做一次。