有许多可能的方法来达到预期的结果。
注意:代码假定基于您没有尝试一次对俱乐部、日期小时分钟和一天时间进行排序,因为它没有在您的问题中声明。所需的排序输出样本将有助于解决您的问题——我们无法理解您的想法。
请研究以下两种可能的方法。
您根据字符串中的 time day 索引声明了排序顺序——让我们以某种方式使用它。为简单起见,我将使用AM,AM2,AFT,PM,EVE,NIGHT 作为初始化字符串。
第一种方法使用%order 散列,time day 是表示数字顺序的键和数字。以数字顺序作为键存储在 HoA 中的字符串。填充哈希后,只需根据数字键顺序打印,并保留它们在输入时出现的顺序。
use strict;
use warnings;
use feature 'say';
my $count = 0;
my @set = split ',', 'AM,AM2,AFT,PM,EVE,NIGHT';
my %order = map { $_ => $count++ } @set;
my %result;
while( <DATA> ) {
chomp;
for my $k ( keys %order ) {
push @{$result{$order{$k}}}, $_ if /_$k\z/;
}
}
for( sort {$a <=> $b} keys %result ) {
say for @{ $result{$_} };
}
__DATA__
CLUB1_20201008_EVE
CLUB1_20201008_AFT
CLUB1_20201008_AM
CLUB1_20201008_AM2
CLUB1_20201008_PM
CLUB1_20201008_NIGHT
CLUB2_20201008_EVE
CLUB2_20201008_AFT
CLUB2_20201008_AM
CLUB1_20201008_AM2
CLUB1_20201008_PM
CLUB1_20201008_NIGHT
输出
CLUB1_20201008_AM
CLUB2_20201008_AM
CLUB1_20201008_AM2
CLUB1_20201008_AM2
CLUB1_20201008_AFT
CLUB2_20201008_AFT
CLUB1_20201008_PM
CLUB1_20201008_PM
CLUB1_20201008_EVE
CLUB2_20201008_EVE
CLUB1_20201008_NIGHT
CLUB1_20201008_NIGHT
第二种方法更简单。根据 time day 索引(在行尾)推送 HoA %result 中的行。然后根据预定义的$order数组打印打印HoA。
use strict;
use warnings;
use feature 'say';
my @order = split ',', 'AM,AM2,AFT,PM,EVE,NIGHT';
my %result;
while( <DATA> ) {
chomp;
push @{$result{$1}}, $_ if /_([^_]+)\z/;
}
for( @order ) {
say for @{ $result{$_} };
}
__DATA__
CLUB1_20201008_EVE
CLUB1_20201008_AFT
CLUB1_20201008_AM
CLUB1_20201008_AM2
CLUB1_20201008_PM
CLUB1_20201008_NIGHT
CLUB2_20201008_EVE
CLUB2_20201008_AFT
CLUB2_20201008_AM
CLUB1_20201008_AM2
CLUB1_20201008_PM
CLUB1_20201008_NIGHT
输出
CLUB1_20201008_AM
CLUB2_20201008_AM
CLUB1_20201008_AM2
CLUB1_20201008_AM2
CLUB1_20201008_AFT
CLUB2_20201008_AFT
CLUB1_20201008_PM
CLUB1_20201008_PM
CLUB1_20201008_EVE
CLUB2_20201008_EVE
CLUB1_20201008_NIGHT
CLUB1_20201008_NIGHT