すべてはデータの保存方法によって異なります。私はあなたがクラスに入っているのであなたの情報をどのように保存する予定か分かりませんし、参照について知っているかもしれません。たとえば、あなたが参照を知っていない場合、あなたはこのような何かを行う可能性があります:
my @array;
foreach my $value (<INPUT>) {
chomp $value;
my ($user1, $user2) = split (" ", $value);
push (@array, "$user1:$user2");
}
これは、1つの文字列として両方の値を格納します。これは、リファレンスを知らない場合には、かなり一般的です。
あなたが言及について知っている場合、あなたはおそらくこれを行うだろう:
my @array;
foreach my $value (<INPUT>) {
chomp $value;
my @line = split (" ", $value);
push (@array, \@line);
}
を私はあなたを伝えることができることはsortサブルーチンはあなたが値を比較し、ソートする関数を作成することを可能にするということです。 sort
で独自の関数を使用すると、ソートする値を表す2つの値$a
と$b
が得られます。これらを操作すると、$ aが$b
より大きい場合は、$a
が$b
または1
より小さい場合は-1
を返し、等しい場合はゼロを返します。 Perlは2つの演算子<=>
とcmp
を用意しています。
参照をまだ学習していないので、値を$user1:$user2
として保存しているとします。ソートルーチンはこのように見えるかもしれません。
sub sort {
my ($a_col1, $a_col2) = split (/:/, $a);
my ($b_col1, $b_col2) = split (/:/, $b);
# Now we compare $a to $b. First, we can compare the
# User 1 column:
if ($a_col1 lt $b_col1) {
return -1; #$a < $b
}
elsif ($a_col1 gt $b_col1) {
return 1; #$a > $b
}
# If we're down here, it's because column 1 matches
# for both $a and $b. We'll have to compare column #2
# to see which one is bigger.
if ($a_col2 lt $b_col2) {
return -1; #$a < $b
}
elsif ($a_col2 gt $b_col2) {
return 1; #$a > $b
}
#We're down here because both column #1 and column #2 match for both
#$a and $b. They must be equal
return 0;
}
さて、私の並べ替えは、次のようなものになります。
my @new_array = sort(\&sort, @array);
を注意:これは私が個人的にそれを行うだろう方法ではありません。私はおそらくcmp
オペレータの組み込みを使用し、いくつかのショートカットを取るだろう。しかし、私はこれを分割して分かりたいと思っています。
ところで、教師が第1列の前に第2列をソートする必要があると判断した場合は、小文字と大なり記号を前後に変更するだけで簡単にsort
サブルーチンを変更できます。
#! /usr/bin/env perl
use strict;
use warnings;
#Putting my data in `@array`
my @array;
foreach my $entry (<DATA>) {
chomp $entry;
my ($user1, $user2) = split " ", $entry;
push @array, "$user1:$user2";
}
# Sorting my data
my @new_array = sort \&sort, @array;
#Now printing out my data nice and sorted...
foreach my $element (@new_array) {
my ($user1, $user2) = split (/:/, $element);
print "$user1\t\t$user2\n";
}
#
# END OF PROGRAM
##################################################
##################################################
# Sort subroutine I'm using to sort the data
#
sub sort {
my ($a_col1, $a_col2) = split (/:/, $a);
my ($b_col1, $b_col2) = split (/:/, $b);
# Now we compare $a to $b. First, we can compare the
# User 1 column:
if ($a_col1 lt $b_col1) {
return -1; #$a < $b
}
elsif ($a_col1 gt $b_col1) {
return 1; #$a > $b
}
# If we're down here, it's because column 1 matches
# for both $a and $b. We'll have to compare column #2
# to see which one is bigger.
if ($a_col2 lt $b_col2) {
return -1; #$a < $b
}
elsif ($a_col2 gt $b_col2) {
return 1; #$a > $b
}
#We're down here because both column #1 and column #2 match for both
#$a and $b. They must be equal
return 0;
}
__DATA__
david fu
david bar
albert foofoo
sandy barbar
albert foobar