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
之后定义的那个(中找不到任何内容的原因是,您正在创建一个全新的、完全独立的%data
在function
内部使用该行
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;"