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.pm という名前のモジュールを作成した MyIxHash という名前のパッケージを使用します。このスクリプトは、モジュールの「IxHash」パッケージを介して継承した「SortByKey」というアルファベット順の並べ替えを実行します。最後の 2 つの種類は、私に問題を与えるものです。私が作成したサブ「SortKeyByFunc」が配列で実行されると、配列とサブルーチンが引数として渡されます。これらの引数を取り、それらを変数に関連付けようとしました。
最後の並べ替えは、文字列の長さで並べ替え、次にアルファベット順に並べ替えることになっています。このためのサブルーチンは、foo.pl の下部に「abcByLength」として提供されます。リバース アルファ ソートと同様に、このサブルーチンはパラメーターとして 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;