perl - 使用来自另一个包的排序子程序

标签 perl sorting package subroutine

我有一个脚本和一个包,如下所示:

# file: sortscript.pl
use strict;
use warnings;
use SortPackage;

my @arrays = ([1,"array1"],[10,"array3"],[4,"array2"]);

print "Using sort outside package\n";
foreach (sort SortPackage::simplesort @arrays){
    print $_->[1],"\n";
}

print "\nUsing sort in same package\n";
SortPackage::sort_from_same_package(@arrays);

——
# file: SortPackage.pm
use strict;
use warnings;
package SortPackage;

sub simplesort{
    return ($a->[0] <=> $b->[0]);
}

sub sort_from_same_package{
    my @arrs = @_;
    foreach (sort simplesort @arrs){
        print $_->[1],"\n";
    } 
}
1;

运行脚本产生输出:
$ perl sortscript.pl
Using sort outside package
Use of uninitialized value in numeric comparison (<=>) at SortPackage.pm line 15.
Use of uninitialized value in numeric comparison (<=>) at SortPackage.pm line 15.
Use of uninitialized value in numeric comparison (<=>) at SortPackage.pm line 15.
Use of uninitialized value in numeric comparison (<=>) at SortPackage.pm line 15.
Use of uninitialized value in numeric comparison (<=>) at SortPackage.pm line 15.
Use of uninitialized value in numeric comparison (<=>) at SortPackage.pm line 15.
array1
array3
array2

Using sort in same package
array1
array2
array3

当子程序在另一个包中时,为什么我不能正确使用它进行排序?

最佳答案

如前所述,$a$b是包全局变量,因此另一种解决方案是将调用站点的全局变量临时别名为包 SortPackage 中的全局变量。 :

{
    local (*a, *b) = (*SortPackage::a, *SortPackage::b);
    foreach (sort SortPackage::simplesort @arrays){
        print $_->[1],"\n";
    }
}

但这当然很丑陋。我只要 SortPackage导出一个完整的排序例程,而不仅仅是一个比较器:
package SortPackage;
use strict;

sub _sort_by_first_element_comparator {
    return $a->[0] <=> $b->[0];
}

sub sort_by_first_element {
    return sort _sort_by_first_element_comparator @_;
}

关于perl - 使用来自另一个包的排序子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508333/

相关文章:

node.js - Node/npm : How to reinstall/recompile copied app packages

python - 如何更改Python 2.7安装包文件夹

perl - 消除代码块歧义的 hashref 前面的 + 的历史是什么?

r - R 是否有像 Perl 的 qw() 这样的类似引号的操作符?

c# - OrderBy 的特例

python - ORDEBY python : How to print list in for loop using this libary

arrays - 如何在 perl 中将数组值拆分为单独的数组

list - 为什么从列表中切片元素不返回列表?

java - 将 "<"或 ">"作为参数传递给比较器

php - 如何将参数传递给 Laravel 包中的 Controller 操作?