Как назначить хэш с заранее заданным значением хеша в Perl? - PullRequest
0 голосов
/ 09 января 2019

Предположим, у меня есть хеш-переменная в скрипте Perl. Я печатаю его значение следующим образом:

print \%MyHash;

и получите следующий вывод: HASH (0x33fa1fc)

Я получаю один и тот же вывод последовательно во многих исполнениях. Для целей создания прототипа я хотел бы сослаться на этот номер в другом скрипте.

Как я могу это сделать? Должен ли я попробовать что-то похожее на это?

my %MyHash;
$MyHash = Ox33fa1fc;

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Это адрес памяти хэша.

Например,

use Devel::Peek  qw( Dump );
use Scalar::Util qw( refaddr );
my %h;
CORE::say(\%h);
CORE::say(sprintf("%x", refaddr(\%h)));
Dump(\%h, 0);

может выдать

HASH(0x1454af8)                   <-- The stringification of the reference.
1454af8                           <-- The address of the referenced variable.
SV = IV(0x1435eb0) at 0x1435ec0   <-- The scalar passed to Dump...
  REFCNT = 1
  FLAGS = (TEMP,ROK)              <-- ...is a reference...
  RV = 0x1454af8                  <-- ...and this is the address of the referenced variable.

Поскольку каждый процесс имеет свое собственное пространство памяти, это значение бесполезно вне процесса, который его сгенерировал. Вы не можете создать ссылку, которая ссылается на этот хеш из другого процесса (и было бы небезопасно, если бы процессы могли обращаться к одному и тому же хешу).


Я получаю один и тот же вывод последовательно во время многих казней.

Кстати, на это нет никаких гарантий. На самом деле, это не так в моей системе.

$ for q in 1 2 3; do perl -e'my %h; CORE::say(\%h);'; done
HASH(0x100c878)
HASH(0x1a08758)
HASH(0x45a31e8)
0 голосов
/ 09 января 2019

Шестнадцатеричное число - это просто адрес, где хеш-переменная находится в памяти. Он может и будет меняться в зависимости от версии Perl и операционной системы, а также от незначительных изменений в выполнении кода. На него нельзя полагаться, что он одинаков для разных сценариев, и perl не предоставляет средств для преобразования адреса обратно в переменную.

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