如何解决将数组添加到没有引用的数组哈希中
我正在使用API来获取信息并将其保存到文件中
#!/bin/perl
use strict;
use warnings;
use JSON;
use Data::Dumper;
my %Hash;
my @Array;
my $url = "https://foo/bar"
my $apidata = `/usr/bin/curl -k -u $url`
my $apidatajson = decode_json $apidata;
my $i=0;
foreach(@{ $apidatajson->{category} }){
@Array=();
my $Name=$apidatajson->{category}[$i]{Name};
my $value=$apidatajson->{category}[$i]{Value};
push(@Array,($Name,$value));
$Hash{$Name}=@Array; # Output 1
$Hash{$Name}=\@Array; # Output 2
$i++;
}
print Dumper \%Hash;
输出1看起来像这样:
$VAR1{
"FooName2" => 2;
"FooName" => 2;
};
输出2看起来像这样:
$VAR1{
"FooName2" => [
"FooName2"
"FooValue2"
]
"FooName" => $VAR1 -> {'FooName2'}
};
Id需要它看起来像这样:
$VAR1 {
"FooName2" => [
"FooName2"
"FooValue2"
]
"FooName" => [
"FooName"
"FooValue"
]
}
所以本质上,我要问的是,如何在不使用引用的情况下将数组的内容保存在哈希中,这样就不会弄乱除最后一个条目之外的所有条目?
解决方法
问题中的代码不是您正在运行的代码。特别是,我怀疑您没有my @Array = ()
行,而是@Array = ()
行(没有my
)。
因此,$Hash{$Name} = \@Array;
引用了foreach
循环外部声明的数组的引用(因为在循环中实际上没有声明),这就是为什么哈希表的两个值都相同的原因。
如果您在循环中声明@Array
,则您的代码可以正常工作。
其他说明:
-
您似乎在“ foreach”循环和C样式的for循环之间感到困惑。您的循环应为:
for (@{ $apidatajson->{category}}){ my @Array; my $Name = $_->{Name}; my $value = $_->{Value}; push(@Array,($Name,$value)); $Hash{$Name} = \@Array; }
或者,因为您实际上不需要
@Array
,所以只需:for (@{ $apidatajson->{category}}){ my $Name = $_->{Name}; my $value = $_->{Value}; $Hash{$Name} = [$Name,$value]; }
或者,如果您需要保留
$i
:for my $i (0 .. $#{$apidatajson->{category}}) { my $Name = $apidatajson->{category}[$i]{Name}; my $value = $apidatajson->{category}[$i]{Value}; $Hash{$Name} = [$Name,$value]; }
-
您无需调用
curl
即可发出http请求。相反,您可以使用像LWP::Simple
这样的Perl模块:use LWP::Simple; my $apidata = get("https://foo/bar") or die "Failed to get data from API!";
尝试一下:
$Hash{$Name}=[$Name,$value];
方括号是Perl中的数组引用。
如果需要,您无法避免使用数组引用。您的要求是矛盾的。
顺便说一句:在第二个版本中创建的是循环引用。可能是因为全局和本地范围中的变量名称相同。但是我认为输出不属于您的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。