perl在%ENV中存储哈希值

时间:2016-08-17 20:09:07

标签: perl hash env

我想(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)."\n\n\n";


$ENV{'myhash'} = \%ahash;
print "fails: ". Dumper(\%ENV)."\n";

2 个答案:

答案 0 :(得分:5)

%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));

我不知道你为什么要这样做。它不允许另一个进程访问数据,因为一个进程无法访问另一个进程的内存。

答案 1 :(得分:1)

您似乎想要共享数据。这是我经常在那里展示的一个例子,它展示了如何将数据存储在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;