Почему эффективность должна быть медленнее?
Если вы выполняете преобразование автоматически или вручную, оно абсолютно одинаковое. Но, делая это автоматически, вам просто нужно набрать меньше кода.
Скалярная переменная в 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
действительны. Это означает, что скаляр в настоящее время содержит действительную строку и действительное целое число. Пока переменная не изменяется, оба значения действительны, и perl не нужно вести разговор.
Но после изменения значения на целое число 5
вы видите, что «POK» больше не устанавливается. Эта операция устанавливает IV в новое значение и делает значение PV недействительным. Пока вы просто работаете с $value
как целое число, ничего дополнительного не произойдет. Как только вы используете $value
в строковом контексте, он выполнит преобразование в строку и обновит PV
и установит POK
. Но сделать это нужно только один раз.