我有一个Perl类。它有一个sort()
方法,我希望它与内置的sort()
函数基本相同:
$object->sort(sub ($$) { $_[0] <=> $_[1] });
但我不能做到:
$object->sort(sub { $a <=> $b });
因为作用域原因。但是List::Util模块使用reduce()函数实现了这个功能。我查看了List::Util模块,他们使用no strict 'vars'进行了一些相当讨厌的操作来完成此操作。我尝试过这样做,但没有成功。
据我所知,reduce()函数之所以能够工作是因为它被导出到适当的命名空间中,因此我的类无法这样做,因为这个函数已经牢固地在另一个命名空间中。这是正确的吗,还是在我的情况下有一些(毫无疑问更加丑陋和不明智的)方法可以实现这一点?
sort
方法调用者相同的包。这就是Sub::Identify发挥作用的地方。 - cjmsort
内置函数也存在同样的问题。它假设比较函数来自调用者相同的包。因此,如果您可以接受这一点,就可以避免对Sub::Identify的依赖。(或者您可以有条件地要求Sub::Identify,并在未安装时回退到caller
。但这需要更多的工作。) - cjm