2011-10-11 27 views
2

我想要找出散列中的鍵的數量和值的數量並打印這些數字。我寫了這樣的代碼,但它沒有給出鍵的數量。我的代碼中有什麼錯誤?散列中的鍵的數量

#!/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

您能否提供inpit數據的示例? – Andrey

+0

等待您在閱讀器while循環內重新初始化散列?在相同的循環中枚舉它的內容呢?這很混亂。這聽起來不像這些問題與你的問題有任何關係,但它們導致你無法獲得正確的輸出。 – dlamblin

回答

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循環,你的$號和$信息覆蓋自己各一次。所以你需要將這些數據存儲在while循環中的散列中。

+0

我按照上面的方法試過,我按照你說的去掉了這一行,然後我刪除了我的第二個while循環,然後它在打印每個數字和信息之後,每次增加時顯示哈希鍵的數量。像1,2,3,.... 141。是否有任何可打印的鍵總數是141這樣,而不是增加1到141.如果把我的第二個while循環無限次地連續無限期地輸出。@ Andrey – viswa

+0

你能否提供輸入數據的例子,你得到的輸出和期望的輸出? – Andrey

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);

+0

你正在寫我的哈希%nums我只有一個元素,所以我如何迭代更多的數字在同一個散列,以記錄我的散列中的所有值。 – viswa

+0

下面是一個例子:'爲我的$ num(1..10){$ nums {$ num} =「info $ num」}'。 '%nums'現在看起來像這樣:'(1 =>'info1',2 =>'info2',...)'。然後看看你有多少個鍵:'打印標量(鍵(%nums))'(將打印'10') – MisterEd

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;