Perl - 在哈希中分配一个哈希引用


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;

这并不像我预期的那样工作。你能告诉我为什么以及如何工作吗?

"这不像我预期的那样工作。">

你期待什么? 让我们逐步完成错误:

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哈希教程,你会发现更深入的东西。

您在包范围的%data(紧随use YAML::XS之后定义的那个(中找不到任何内容的原因是,您正在创建一个全新的、完全独立的%datafunction内部使用该行

my %data = %$data;

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

试试这个:

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

我认为你有一个错字:

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

必须是

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

并且$content不是对%data hash的引用,因此在您的函数中您应该执行以下操作:

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

相关内容

最新更新