Не влияет на эффективность автоматического преобразования между числами и строками? - PullRequest
3 голосов
/ 07 июля 2011

В Perl существует автоматическое преобразование чисел в строки.

Из книги Ламы:

Вам не нужно беспокоиться о разница между числами и строки; просто используйте правильный операторы, и Perl сделает все это работа.

И если вы беспокоитесь о эффективность, не будь. Perl вообще запоминает результат конвертации так что это делается только один раз.

Как это происходит? Я имею в виду, как Perl запоминает это и на сколько времени?

Разве это не влияет на эффективность даже на один бит?

1 Ответ

13 голосов
/ 07 июля 2011

Почему эффективность должна быть медленнее?

Если вы выполняете преобразование автоматически или вручную, оно абсолютно одинаковое. Но, делая это автоматически, вам просто нужно набрать меньше кода.

Скалярная переменная в 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. Но сделать это нужно только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...