我正在尝试访问我在Perl中存储在数组中的哈希的每个成员。我已经看过Looping through an array of hashes in Perl,我需要一种更好的方法来访问它们。我的最终结果是将每个项目(哈希)分成一个数组,将该哈希的键存储在一个新数组中,将数组的值存储在不同的数组中。
编辑:我改变了他们的方式,我的哈希得到他们的数据以更好地反映我的代码。我认为这不重要,但确实如此。
<XML>
<computer>
<network>
<interface1>
<name>eht0</name>
<ip>182.32.14.52</ip>
</interface1>
<interface2>
<name>eth2</name>
<ip>123.234.13.41</ip>
</interface2>
</network>
</computer>
</xml>
my %interfaceHash;
for(my $i=0; $i < $numOfInterfaces; $i++ ){
my $interfaceNodes = $xmldoc->findnodes('//computer/network/interface'.($i+1).'/*');
foreach my $inode ($interfaceNodes->get_nodelist){
my $inetValue = $inode->textContent();
if ($inetValue){
my $inetField = $inode->localname;
push (@net_int_fields, $inetField);
push (@net_int_values, $inetValue);
}
}
for(my $i =0; $i< ($#net_int_fields); $i++){
$net_int_hash{"$net_int_fields[$i]"} = "$net_int_values[$i]";
}
push (@networkInterfaces, \%net_int_hash); #stores
}
现在,如果我尝试访问该数组,它会清除散列中存储的内容。
答案 0 :(得分:3)
要在Perl中构建复杂的数据结构,请先阅读perldsc - Perl Data Structures Cookbook。
#!/usr/bin/perl
use warnings;
use strict;
my %interface1 = (iFaceName => 'eth0',
ipAddr => '192.168.0.43',
);
my %interface2 = (iFaceName => 'eth1',
ipAddr => '192.168.10.64',
);
my @networkInterfaces;
my @iFaceKeys;
my @iFaceVals;
push @networkInterfaces, \%interface1; # Note the backslash!
push @networkInterfaces, \%interface2;
for my $iFace (@networkInterfaces) {
push @iFaceKeys, keys %$iFace;
push @iFaceVals, values %$iFace;
}
答案 1 :(得分:1)
您的问题是哈希不能是数组的成员。只有一个标量可以。
数组中所需的不是散列,而是散列的标量引用:
push @networkInterfaces \%interface1; # \ is a reference taking operator
然后,要访问该hashref的单个元素,请执行
$networkInterfaces[0]->{iFaceName}; # "->{}" accesses a value of a hash reference
要访问整个哈希(例如获取其密钥),请使用%{ hashref }
语法取消引用:
foreach my $key ( keys %{ $networkInterfaces[0] } ) {
答案 2 :(得分:0)
执行此操作的一个好方法是创建一个散列引用数组。
%first_hash = (a => 1, b => 2);
%second_hash = (a => 3, b => 4);
@array_of_hash_refs = ( \%first_hash, \%second_hash );
foreach $hash_ref (@array_of_hash_refs)
{
print "a = ", $hash->{a}, "\n";
print "b = ", $hash->{b}, "\n";
}
请记住,perl具有不同的语法来访问哈希数据,具体取决于您使用的是哈希对象还是对哈希对象的引用。
$hash_ref->{key}
$hash{key}