Все зависит от того, как вы храните свои данные. Я не уверен, как вы планируете хранить вашу информацию, так как вы в классе и можете или не могли узнать о ссылках. Например, если вы не знаете ссылок, вы можете сделать что-то вроде этого:
my @array;
foreach my $value (<INPUT>) {
chomp $value;
my ($user1, $user2) = split (" ", $value);
push (@array, "$user1:$user2");
}
Это будет хранить оба значения в виде одной строки. Это довольно часто, если вы не знаете о ссылках.
Если вы знаете о ссылках, вы, вероятно, сделаете это:
my @array;
foreach my $value (<INPUT>) {
chomp $value;
my @line = split (" ", $value);
push (@array, \@line);
}
Что я могу вам сказать, так это то, что подпрограмма sort позволяет вам создать функцию для сравнения и сортировки значений. Когда вы используете свою собственную функцию в sort
, вы получаете два значения $a
и $b
, которые представляют значения, которые вы сортируете. Вы можете манипулировать ими, а затем возвращать -1
, если $a
меньше $b
или 1
, если $ a больше $b
, или возвращать ноль, если они оба равны. Perl предоставляет вам два оператора <=>
и 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
и воспользовался бы некоторыми сочетаниями клавиш. Однако я хотел разобрать это на части, чтобы вы могли понять.
Кстати, если учитель решит, что вы должны отсортировать второй столбец перед первым, вы можете легко изменить подпрограмму 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