假设我在Perl脚本中有一个哈希变量。我通过以下方式打印其值:
print \%MyHash;
并获得以下输出: 哈希(0x33fa1fc)
在多次执行期间,我始终如一地收到相同的输出。出于原型目的,我想在另一个脚本中引用该数字。
我该怎么办?我应该尝试类似的东西吗?
my %MyHash;
$MyHash = Ox33fa1fc;
答案 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)