我从未使用过 Perl,但我需要完成这个练习。我的任务是以几种不同的方式对数组进行排序。我得到了一个测试脚本。该脚本将数组放在一起,并为其排序的每个阶段打印语句。我将其命名为 foo.pl:
use strict;
use warnings;
use MyIxHash;
my %myhash;
my $t = tie(%myhash, "MyIxHash", 'a' => 1, 'abe' => 2, 'cat'=>'3');
$myhash{b} = 4;
$myhash{da} = 5;
$myhash{bob} = 6;
print join(", ", map { "$_ => $myhash{$_}" } keys %myhash) . " are the starting key => val pairs\n";
$t->SortByKey; # sort alphabetically
print join(", ", map { "$_ => $myhash{$_}" } keys %myhash) . " are the alphabetized key => val pairs\n";
$t->SortKeyByFunc(sub {my ($a, $b) = @_; return ($b cmp $a)}); # sort alphabetically in reverse order
print join(", ", map { "$_ => $myhash{$_}" } keys %myhash) . " are the reverse alphabetized key => val pairs\n";
$t->SortKeyByFunc(\&abcByLength); # use abcByLength to sort
print join(", ", map { "$_ => $myhash{$_}" } keys %myhash) . " are the abcByLength sorted key => val pairs\n";
print "Done\n\n";
sub abcByLength {
my ($a, $b) = @_;
if(length($a) == length($b)) { return $a cmp $b; }
else { return length($a) <=> length($b) }
}
Foo.pl 使用一个名为 MyIxHash 的包,我为它创建了一个名为 MyIxHash.pm 的模块。该脚本按字母顺序运行:“SortByKey”,我通过模块中的“IxHash”包继承了它。最后两种是给我带来问题的。当我创建的 sub: "SortKeyByFunc" 在数组上运行时,它传入数组和一个子例程作为参数。我试图接受这些论点并将它们与变量相关联。
最终排序应该按字符串长度排序,然后按字母顺序排序。在 foo.pl 的底部提供了一个子程序,名称为“abcByLength”。与反向 alpha 排序一样,此子例程作为参数传递给我的 SortKeyByFunc 子例程。
对于这两种类型,似乎为我完成了实际的排序工作,我只需要将这个子例程应用于我的数组。
我的主要问题似乎是,如果可能的话,我不知道如何获取我的子例程参数并通过它作为参数运行我的数组。我在我的阵列上错误地运行我的方法?
package MyIxHash;
#use strict;
use warnings;
use parent Tie::IxHash;
use Data::Dumper qw(Dumper);
sub SortKeyByFunc {
#my $class = shift;
my ($a, $b) = @_;
#this is a reference to the already alphabetaized array being passed in
my @letters = $_[0][1];
#this is a reference to the sub being passed in as a parameter
my $reverse = $_[1];
#this is my variable to contain my reverse sorted array
my @sorted = @letters->$reverse();
return @sorted;
}
1;