2012-06-27 41 views
2

我想了解perl中的一段代碼,但是我遇到了一些麻煩,它對perl編程有點新鮮。在perl中使用ne比較兩個哈希

我有兩個散列,它們在for循環的不同迭代中以相同的順序輸入相同的(鍵,值)對。

迭代1創建%hash1,迭代2創建%hash2。

%hash1 = (1 => 10, 2 => 20, 3=> 30);

%hash2 = (1 => 10, 2 => 20, 3=> 30); 

然後就是比較這些命令:去作爲,

if (%hash1 ne %hash2) {print "Not Equal"; die;} 

我的問題是:

(1)究竟是什麼在上面的if語句相比?

(2)我想分配,

my $a = %hash1; my $b = %hash2; 

但這些讓我喜歡3/8輸出! 這可能是什麼?

任何幫助將不勝感激。

回答

10

ne是字符串比較運算符。它的操作數是字符串,因此是標量。從perldata,

如果您評估標量上下文中的散列值,它將在散列值爲空時返回false。如果有任何鍵/值對,則返回true;更準確地說,返回的值是一個字符串,由使用的存儲段數和分配的存儲段數組成,並由斜槓分隔。

因此,比較兩個散列具有相同數量的已使用存儲區並且兩個散列具有相同數量的已分配存儲區。

比較哈希的一種方法是使用JSON:XScanonical集對它們進行字符串化。

JSON::XS->new->canonical(1)->encode(\%hash) 
+0

這是非常有益的。謝謝。爲了澄清,我認爲用過的桶的數量與哈希中的鍵的數量相同嗎? – abhIta

+4

沒有。哈希表的核心是一個鏈接列表數組。 「桶」是賦予該數組元素的名稱。散列的每個元素都是鏈接列表的一個元素,而不是數組的元素。密鑰的數量和桶的數量之間沒有任何關係。 [哈希表](http://en.wikipedia.org/wiki/Hash_table) – ikegami

+0

謝謝! – abhIta

0

有一個模塊Data::Compare可供在CPAN比較散列。這工作如下:

use Data::Compare; # exports subroutine: Compare() ! 
... 

my %hash1 = (1 => 10, 2 => 20, 3 => 30); 
my %hash2 = (1 => 10, 2 => 20, 3 => 30); 

# This won't work: 
# if (%hash1 ne %hash2) {print "Not Equal"; die;} 

# This works: 
if(! Compare(\%hash1, \%hash2) ) { print "Not Equal"; die; } 

... 

這不是一個核心模塊,你必須安裝它。它也可以在activeperl/windows下使用(在他們的默認存儲庫中)。

問候,

RBO