我正在使用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'}
};
我需要它看起来像这样:
$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请求。相反,您可以使用Perl模块,例如LWP::Simple
:
use LWP::Simple;
my $apidata = get("https://foo/bar") or die "Failed to get data from API!";
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句