所以我有一個Perl類。它有一個sort()
方法,我希望它是或多或少相同的內置sort()
功能:Perl的變量範圍問題
$object->sort(sub ($$) { $_[0] <=> $_[1] });
但我不能這樣做:
$object->sort(sub { $a <=> $b });
因爲作用域。但是List :: Util模塊用reduce()
來做到這一點。我看了看錶::的Util模塊,和他們做一些比較討厭的事情no strict 'vars'
做到這一點。我試過了,但無濟於事。
我的理解是,reduce()
的工作方式是因爲它被導出到適當的名稱空間,因此我的類無法做到這一點,因爲函數在另一個名稱空間中非常穩固。這是正確的嗎?或者在我的情況下是否有一些(無疑是更可怕和不明智的)方法來做到這一點?
這可能足以滿足您的需要,但它很脆弱。不能保證比較函數與'sort'方法的調用者屬於同一個包。這就是Sub :: Identify進來的地方。 – cjm 2009-08-25 05:29:58
@cjm - 這是真的,我一定會看到Sub :: Identify,但是我的更大的問題是讓它工作,而不是在一般情況下工作。具體的解決方案比一般的失敗要好。但是,將這個答案與你的結合起來會給我一個通用的解決方案,這是一件好事。 – 2009-08-25 05:37:18
雖然事實證明'sort'內建有同樣的問題。它假定比較函數來自與調用者相同的包。所以,如果你能忍受這一點,你可以保存對Sub :: Identify的依賴。 (或者你可以有條件地要求Sub :: Identify,如果沒有安裝,可以回到'caller',但這是更多的工作。) – cjm 2009-08-25 05:51:08