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;
这不符合我的预期。你能告诉我为什么以及如何运作?
答案 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)
您在包范围%data
(use 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;"