我有一个不区分大小写的排序功能。如果它来自相同的程序包,则可以使用,但是不能。
这有效:
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;
这是怎么回事?如何在另一个程序包中放置排序功能?
答案 0 :(得分:5)
您有什么证据证明它不起作用?您是否在子例程中放入了print()
语句以查看其是否被调用?
我怀疑您为此被绊倒(来自perldoc -f sort
):
$a
和$b
在调用sort()的程序包中设置为程序包全局变量。这意味着$main::a
包中的{{1}和$main::b
(或$::a
和$::b
),{{ {1}}包装等。
哦,稍后会更具体:
使用
main
和$FooPack::a
编写的排序子例程绑定到它们的调用包。可以在一个不同的包中定义它们,但出于有限的考虑,因为子例程必须仍然引用调用包的$FooPack::b
和FooPack
:$a
使用原型版本(请参见上文)作为更通用的选择。
上面描述了“原型版本”:
如果子例程的原型为
$b
,则与常规子例程一样,要比较的元素在$a
中通过引用传递。这比没有原型的子例程要慢,在子例程中,要比较的元素作为包全局变量$b
和package Foo; sub lexi { $Bar::a cmp $Bar::b } package Bar; ... sort Foo::lexi ...
传递到子例程中(请参见下面的示例)。
所以您可以尝试像这样重写子例程:
($$)
然后使用最后两种选择之一调用它。