如何在Perl中为哈希分配预定义的哈希值?

时间:2019-01-09 12:30:34

标签: perl

假设我在Perl脚本中有一个哈希变量。我通过以下方式打印其值:

print \%MyHash;

并获得以下输出: 哈希(0x33fa1fc)

在多次执行期间,我始终如一地收到相同的输出。出于原型目的,我想在另一个脚本中引用该数字。

我该怎么办?我应该尝试类似的东西吗?

my %MyHash;
$MyHash = Ox33fa1fc;

2 个答案:

答案 0 :(得分:3)

十六进制数字只是哈希变量恰好驻留在内存中的地址。它可以并且将会随着perl的不同发行版,操作系统的不同发行版或代码执行中的微小更改而发生变化。不能依靠脚本之间的相同来实现,并且perl没有提供将地址转换回变量的功能。

答案 1 :(得分:1)

这是哈希的内存地址。

例如,

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)