%a = ( "KEY" => {
"p1" => 1 , [1223],
"p1" => 2 , [2323],
"p1" => 3 , [2353],
}
);
我想生成这样的结构。我试过这段代码:
@array = ( 1223 , 2323 ,2353 );
$count = 0;
foreach my $i (@array) {
$a{"KEY"} => { "p1" => $count , [$i] };
$count++;
}
如何创建这样的哈希?
答案 0 :(得分:6)
由于哈希只能有唯一的密钥,因此无法实现上述数据结构。您应该将键KEY
的值替换为ARRAYREF而不是HASHREF。
以下程序似乎可以使用ARRAYREF执行您想要的操作。
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @array = ( 1223, 2323, 2353 );
my ( $count, %hash ) = (0);
for (@array) {
push @{ $hash{KEY}->{SUBKEY} }, { p1 => $count, v2 => $array[$count] };
$count++;
}
print Dumper \%hash;
答案 1 :(得分:3)
您尝试在同一个哈希中为每个键存储多个值。这不起作用。 您的示例代码也有几个语法错误,例如缺少分号,使用 =>而不是=用于分配。
假设我们将您的数据结构修改为:
%a = ( "KEY" => {
"p1" => [1 , 1223],
"p2" => [2 , 2323],
"p3" => [3 , 2353],
});
您可以像这样构建此结构:
use strict;
use warnings;
my %a = ();
my @array = (1223, 2323, 2353);
my $count = 0;
foreach my $i (@array) {
$a{"KEY"}{"p$count"} = [$count, $i];
$count++;
}
答案 2 :(得分:2)
你无法创建这样的结构。
首先,1, [1223]
不是标量。
您可以拥有[1, 1223]
第二次,您不能多次使用相同的键名。因此,重用p1
是不可能的。
答案 3 :(得分:2)
use Data::Dumper::Simple;
@array = ( 1223 , 2323 ,2353 );
my %a = ();
my %b = ();
for (my $i = 0; $i < scalar @array; $i++) {
$b{"p$i"} = [$i+1, $array[$i]];
}
$a{"KEY"} = \%b;
print Dumper(%a);
答案 4 :(得分:1)
最快,最简单 - 最易维护的方式 - 我知道写的是:
use English qw<$RS>;
#use Smart::Comments;
use YAML;
my $s = do { local $RS; Load( <DATA> ); };
### $s
# Above "smart comment" does roughly the same thing as:
use Data::Dumper;
print Dumper( $s );
__DATA__
---
KEY:
p1:
-
- 1
- 1223
-
- 2
- 2323
-
- 3
- 2353
但实际上,XML更像是一个列表(带有一些头信息)类型的构造。标签可以很好地用作名称 - 值列表。我推荐更多这种类型的结构:
---
- name : KEY
p1 : 1
text : 1223
- name : KEY
p1 : 2
text : 2323
- name : KEY
p1 : 3
text : 2353
甚至更规格的声音:
---
- node-name : KEY
attributes :
-
- p1
- 1
children :
- 1223
保留订单
答案 5 :(得分:0)
use Data::Dumper;
my @array = ( 1223 , 2323 ,2353 );
my $count = 1;
my @result;
# build it
push(@result, {"p1" => [$count, $_]}), $count++ foreach @array;
# show it
print Dumper(\@result);
sub xml {
my ($key, $index, $value) = @_;
print "<KEY ", qq($key="$index">), $value, "</KEY>";
}
# unravel it, producing results
map {
my %hash = %$_;
my @key = keys(%hash);
my $key = shift(@key);
my @value = @{$hash{$key}};
xml($key, @value);
} @result;
# but, since your xml attribute doesn't change, nor does the
# tag, you're unnecessarily obfuscating the problem, so
# this will do (ignore the above code):
my @array = ( 1223 , 2323 ,2353 );
my $count = 1;
map {
print qq(<KEY p1="$count">$_</KEY>);
$count++;
} @array;
print "\n";
使用Perl,数据结构可以像您想要的那样复杂,但这是KISS的情况。