Perl排序将不使用其他包中的函数

时间:2019-12-09 13:33:41

标签: perl

我有一个不区分大小写的排序功能。如果它来自相同的程序包,则可以使用,但是不能。

这有效:

my @arr = sort {lc $a cmp lc $b} @list;

这有效(如果在同一文件中定义了一个名为“ isort”的函数):

my @arr = sort isort @list;

这不是(从其他程序包随Exporter导出的功能):

my @arr = sort isort @list;

这不是(包名称明确引用的功能):

my @arr = sort Utils::isort @list;

这是怎么回事?如何在另一个程序包中放置排序功能?

1 个答案:

答案 0 :(得分:5)

您有什么证据证明它不起作用?您是否在子例程中放入了print()语句以查看其是否被调用?

我怀疑您为此被绊倒(来自perldoc -f sort):

  

$a$b在调用sort()的程序包中设置为程序包全局变量。这意味着$main::a包中的{{1}和$main::b(或$::a$::b),{{ {1}}包装等。

哦,稍后会更具体:

  

使用main$FooPack::a编写的排序子例程绑定到它们的调用包。可以在一个不同的包中定义它们,但出于有限的考虑,因为子例程必须仍然引用调用包的$FooPack::bFooPack

$a
     

使用原型版本(请参见上文)作为更通用的选择。

上面描述了“原型版本”:

  

如果子例程的原型为$b,则与常规子例程一样,要比较的元素在$a中通过引用传递。这比没有原型的子例程要慢,在子例程中,要比较的元素作为包全局变量$bpackage Foo; sub lexi { $Bar::a cmp $Bar::b } package Bar; ... sort Foo::lexi ... 传递到子例程中(请参见下面的示例)。

所以您可以尝试像这样重写子例程:

($$)

然后使用最后两种选择之一调用它。