这完全取决于您存储数据的方式。我不确定您打算如何存储您的信息,因为您在课堂上并且可能已经或可能没有了解参考资料。例如,如果你不知道引用,你可能会这样做:
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,它们代表您正在排序的值。您可以操作这些,然后如果$a 小于$b 或1 如果$a 大于$b 则返回-1,或者如果它们都相等则返回零。 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