2010-09-13 59 views
28

我想在Perl中表示一個集合。我最常做的用一些虛值的哈希,例如:如何在Perl中表示集合?

my %hash=(); 
$hash{"element1"}=1; 
$hash{"element5"}=1; 

然後使用if (defined $hash{$element_name})來決定一個元素是否是在集。

這是常見的做法嗎?任何改善這個問題的建議?

此外,我應該使用definedexists

謝謝

回答

10

在CPAN上使用衆多Set模塊之一。從你的例子來看,Set::LightSet::Scalar似乎是合適的。


我能捍衛這個建議與普遍觀點親CPAN(不考慮可能的協同效應)。

  1. 我們怎麼能知道查找是現在還是將來所需要的?經驗教導,even the simplest programs expand and sprawl。使用模塊可以預料到。
  2. 由於API允許考慮不同抽象層次上的部分問題,所以對於維護或者需要閱讀和理解代碼的人來說,API更適合於臨時實現。
  3. 與此相關的是,如果發現開銷不理想,則通過去除間接或削減數據結構和源代碼很容易從模塊轉到簡單模式。但另一方面,如果需要更多的功能,實現其他方式則更爲困難。
  4. CPAN模塊已經過測試並在一定程度上徹底調試過,也許API也經歷了一段時間的改進步驟,而使用ad-hoc,programmers usually implement the first design that comes to mind

很少事實證明,在開始選擇一個模塊是錯誤的選擇。

+1

除了開銷之外,還有什麼東西給你嗎?設置操作還是什麼?如果我所做的只是檢查一個集合中是否存在某個項目,爲什麼我會使用一個庫來執行某種語言已經非常好的語言? – 2010-09-13 11:49:14

+0

關於支持集合集的模塊的任何建議? – 2010-09-13 11:52:51

+0

Set的集合聽起來像是一個Set :: Object的作業,它的實例可以嵌套。 – daxim 2010-09-13 12:35:23

0

這就是我一直這樣做的。我傾向於使用exists而不是defined,但他們都應該在這種情況下工作。

38

是的,構建散列集是一種常見的習慣用法。需要注意的是:

my @keys = qw/a b c d/; 
my %hash; 
@hash{@keys} =(); 

優選使用1作爲值因爲undef佔用顯著更少的空間。這也迫使你使用exists(無論如何這是正確的選擇)。

+0

+1謝謝。請參閱有關「深層次」的相關問題:http://stackoverflow.com/questions/3700069/how-to-check-if-a-key-exists-in-a-deep-perl-hash – 2010-09-13 11:54:27

相關問題