![](/img/trans.png)
[英]How can I create the XML::Simple data structure using a Perl XML SAX parser?
[英]How can I create a complex data structure in Perl?
%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++;
}
如何創建這樣的哈希?
由於散列只能具有唯一鍵,因此無法實現上述數據結構。 您應該將鍵KEY
的值替換為ARRAYREF而不是HASHREF。
下面的程序似乎通過使用ARRAYREFs來完成您想要的事情。
#!/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;
您試圖在同一哈希中為每個鍵存儲多個值。 那不行 您的示例代碼還存在多個語法錯誤,例如缺少分號,使用=>而不是=進行賦值。
假設我們將您的數據結構修改為如下所示:
%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++;
}
您不能創建這樣的結構。
首先 , 1, [1223]
不是標量。
您可能有[1, 1223]
其次 ,您不能多次使用相同的鍵名。 因此,重用p1
是不可能的。
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);
我知道最快,最簡單和最可維護的方式是這樣寫的:
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
保留訂單
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的一種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.