所以我有一个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