哈希中的键数

时间:2011-10-11 14:56:36

标签: perl

我试图找出哈希中的键数和值数并打印这些数字。我已经编写了这样的代码,但它没有给出密钥的数量。我的代码中有什么错误?

#!/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);
}

当我尝试执行它时,它只提供一个数字,但我有更多的数字。也许我的哈希包含一个数字,但是如何迭代我的哈希以存储更多数字呢?

3 个答案:

答案 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为值。 (更常规和可读的方式来声明%numsmy %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;