0
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;

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

4

3 回答 3

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
    }    
};

注意声明中使用的花括号{},而不是(). 当您像 with 一样嵌套(匿名)哈希时hr2,请始终使用该形式。

如果你搜索perl hash tutorial,你会发现更深入的东西。

于 2012-05-20T09:00:41.747 回答
3

%data您在 package-scoped (紧随其后定义的那个)中找不到任何内容的原因是因为您正在使用该行use YAML::XS创建一个全新且完全独立%data的内部function

my %data = %$data;

这会创建一个新的散列并将 引用的散列的内容复制$data到其中。

试试这个:

sub function {
  my ($id, $data, $content) = @_;
  my $out = decode_json($content);
  say "out:", Dump $out;
  $data->{$id} = $out;
}
于 2012-05-20T11:51:42.083 回答
0

我认为你有一个错字:

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

一定是

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

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

my %data=%$data;  # in place of "my %content=%$content;"
于 2012-05-20T09:32:57.283 回答