我想(ab-)使用全局%ENV来存储散列。对于%ENV,这似乎与普通哈希的工作方式不同。在下面的程序中,$ENV{myhash}
仍然包含'myhash' => 'HASH(0x7ffad8807380)'
, %ahash
仍然存在。是否有可能将十六进制地址转换回指向其位置,而不仅仅包含字符串?我想我可以序列化和反序列化哈希。正确的做法是什么?
#!/usr/bin/perl -w
use common::sense;
use Data::Dumper;
my %QENV = ( nohash => 'noh' );
my %ahash= ( hv1 => 'htext1', hv2 => 'htext2' );
$QENV{'myhash'} = %ahash;
print "works: ". Dumper(%QENV)."nnn";
$ENV{'myhash'} = %ahash;
print "fails: ". Dumper(%ENV)."n";
%ENV
是一个神奇的散列。它反映了过程的环境。从它读取数据就是从环境读取数据,向它写入数据会改变环境。
如果你能保证被引用的变量仍然是活的(通过它仍然在作用域中或者通过它的REFCNT
增加),你确实可以从地址创建一个对它的引用。
use strict;
use warnings;
use Data::Dumper;
use Inline C => <<'__EOS__';
SV* _newRV(IV iv) {
return newRV((SV*)iv);
}
__EOS__
my %hash = ( a => 1, b => 2 );
my $ref = %hash;
my $ref_string = "$ref";
my $addr = hex( ( $ref_string =~ /((.*))/ )[0] );
my $ref2 = _newRV($addr);
print(Dumper($ref2));
我不知道你为什么要这样做。它将不允许其他进程访问数据,因为一个进程不能访问另一个进程的内存
您似乎想要共享数据。这里有一个我经常放在那里的示例,它展示了如何在JSON文件中存储数据,然后检索它。JSON是跨语言的,因此数据可以被许多编程语言使用,而不仅仅是Perl。尽管这个示例是在一个脚本中,但可以想象它是两个不同的Perl应用程序:
use warnings;
use strict;
use JSON;
my $file = 'data.json';
my %h = (
foo => 'bar',
raz => {
ABC => 123,
XYZ => [4, 5, 6],
}
);
my $json = encode_json %h;
# write the JSON to a file, and close it
open my $fh, '>', $file or die $!;
print $fh $json;
close $fh or die $!;
# open the JSON file, and read it
open my $json_file, '<', $file or die $!;
my $read_json;
{
local $/;
$read_json = <$json_file>;
}
my $perl_hash = decode_json $read_json;