我从来没有使用过Perl,但我需要完成这个练习。我的任务是以几种不同的方式对数组进行排序。我已经提供了一个测试脚本。该脚本将数组放在一起,并为其排序的每个阶段打印语句。我把它命名为foo.pl:为什么我的排序工作不在Perl中?
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”包继承。最后两种是给我的问题。当我创建的子集:“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;
@ user1361666:没问题。如果您找到了解决问题的答案(本或其他),请不要忘记单击左侧的复选标记图标接受答案。 –
谢谢你的回应。 您提供的代码不会抛出任何错误,但它也不会排序我的数组。 当您提到$ a和$ b变量时,您是指我的SortKeyByFunc子例程中的my($ a,$ b)= @;' 或者从foo.pl传入的子例程中的行 ?我问,因为foo.pl是为我提供的脚本,不应该被改变。 当他们打电话给我的子这被传递: '$ T-> SortKeyByFunc(子{我的($ A,$ B)= @_;回报($ B $ CMP一)});' 谢谢寻求帮助。 – Esten
那么,你真正应该做的是去写'foo.pl'的人,问他们在想什么。但是如果你真的必须使用一个外部提供的比较函数,它不符合'sort'使用的通常调用约定,那么你最好的办法就是为它编写一个包装器;看到我上面的编辑。 –