我试图找出哈希中的键数和值数并打印这些数字。我已经编写了这样的代码,但它没有给出密钥的数量。我的代码中有什么错误?
#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML::Reader;
my $file;open $file, 'formal.xml');
my $reader = XML::LibXML::Reader->new( IO => $file ) or die ("unable to open file");
while ( $reader->nextElement( 'DATA' ) ) {
my $info = $reader->readOuterXml();
$reader->nextElement( 'Number' );
my $number = $reader->readInnerXml();
print( "num: $number\n" );
print( " datainfo: $info\n" );
如何将这些num和datainfo存储在哈希中?我如何计算哈希中的键数?我试过这样但是没有用。
my %nums =( "$number", $info);
while ((my $keys, my $values) = each (%nums)) {
print ("NUMBER:$keys." =>"INFORMATION: ".$values." \n");
}
my $key_count = keys %nums;
print "$key_count";
}
close($file);
}
当我尝试执行它时,它只提供一个数字,但我有更多的数字。也许我的哈希包含一个数字,但是如何迭代我的哈希以存储更多数字呢?
答案 0 :(得分:7)
keys()
和values()
都返回数组。在标量上下文中引用时,Perl中的数组返回数组的大小。因此,要获取哈希值中的键或值的数量,只需在标量上下文中引用keys()
或values()
的结果:
# prints the number of keys
print( scalar(keys(%hash)), "\n" );
print( keys(%hash) . "\n" );
# prints the number of values
print( scalar(values(%hash)), "\n" );
print( values(%hash) . "\n");
使用您的%nums
数组:
my %nums = ( $number, $info );
print( "number of keys: ", scalar(keys(%nums)), "\n" ); # will print `1'
请注意,您的%nums
哈希只有一个键值对,其中$number
为键,$info
为值。 (更常规和可读的方式来声明%nums
)my %nums = ( $number => $info );
)
答案 1 :(得分:2)
试
my %nums;
while ( $reader->nextElement( 'DATA' ) ) {
my $info = $reader->readOuterXml();
$reader->nextElement( 'number' );
my $number = $reader->readInnerXml();
$nums{$number} = $info;
print( "num: $number\n" );
print( " datainfo: $info\n" );
}
并删除my %nums =( "$number", $info);
当你进行while循环时,$ number和$ info每次都会覆盖自己。所以你需要将这些数据存储在while循环的哈希值中。
答案 2 :(得分:1)
目标:我正在尝试找出哈希值中的数字键和值数。
以下是这个问题的直接答案。
要获取哈希中键的数量,请在标量上下文中应用keys
函数:
scalar keys %my_hash
# -or-
my $number_of_keys = keys %my_hash;
值的数量将相同(尽管可能未定义一个或多个值)。您可以通过以类似方式应用values
函数来证明这一点:
scalar values %my_hash
# -or-
my $number_of_values = values %my_hash;