Perl - 在散列中分配散列引用

时间:2012-05-20 08:49:03

标签: perl hash reference

use 5.010;
use strict;
use warnings;
use JSON::XS;
use YAML::XS;
my %data = ();
my $content = <<HERE;
{
  "name":"BLAHBLAH","contact":{"phone":"12345","twitter":"BLAHBLAH"},
  "location": {"address":"NOTTELLING","lat":10,"lng":10,"postalCode":"1234",
  "city":"BLAH","state":"BLAH","country":"BLAH"},
  "categories":[{"id":"BLAH","name":"BLAH"}]
}
HERE

my $id = "name1";

sub function {
    my ( $id, $data, $content ) = @_;
    my %data = %$data;
    my $out = decode_json($content);
    say "out:", Dump $out;
    $data{$id} = $out;
}

function( $id, \%data, $content );
say "data:", Dump %data;

这不符合我的预期。你能告诉我为什么以及如何运作?

3 个答案:

答案 0 :(得分:4)

  

“这不符合我的预期。”

你在期待什么?让我们逐步解决错误:

1)date!= data

2)$content=~m!(,*)!会将$1留空,因为$content不包含任何逗号。

3)decode_json($1)会抛出运行时错误,因为$1为空,decode_json() 只能应用于格式正确的JSON字符串。

4)$id未定义。

  

“你能告诉我为什么以及如何运作?”

如果还不清楚的话,它将不起作用。 错误多于那里的代码。

  

“如何将哈希引用分配给哈希?”

使用\一元参考运算符,例如:

my %h = ();

my %h2 = (
    a => 10
);

$h{h2} = \%h2;

print $h{h2}->{a};  

您还可以声明标量($)作为对匿名(未命名)哈希的引用;这里$hr是一个引用,哈希本身没有与之关联的符号或名称:

my $hr = {
    n => 42
};

# as an existing hash member:

$h{h3} = {
    x => 666,
    # some other examples:
    hr => \%h2,
    hr2 => {
        x => 1024
    }    
};

注意声明中使用的花括号{}而不是()。当您使用hr2嵌套(匿名)哈希时,请始终使用该表单。

如果您搜索 perl哈希教程,您会发现更深入的内容。

答案 1 :(得分:2)

您在包范围%datause YAML::XS之后定义的那个)中找不到任何内容的原因是因为您正在创建一个全新且完全独立的{{1使用

行在%data内部
function

这将创建一个新哈希,并将my %data = %$data; 引用的哈希内容复制到其中。

请改为尝试:

$data

答案 2 :(得分:0)

我认为你有一个错字:

function($id,/%data,$content);

必须是

function($id,\%data,$content);

和$ content不是对%data hash的引用,所以在你的函数中你应该这样做:

my %data=%$data;  # in place of "my %content=%$content;"