В grouped_by_hour
ниже, для каждой строки из дескриптора файла, если у него есть временная метка и имя, мы push
будем указывать это имя в массиве, связанном с часом временной метки, используя sprintf
для нормализации часа в случаеодна временная метка равна 03:04:05
, а другая - 3:9:18
.
sub grouped_by_hour {
my($fh) = @_;
local $_;
my %hour_names;
while (<$fh>) {
push @{ $hour_names{sprintf "%02d", $1} } => $2
if /^(\d+):\d+:\d+\s+(.+?)\s*$/;
}
wantarray ? %hour_names : \%hour_names;
}
Нормализованные часы также позволяют нам выполнять сравнение по умолчанию.Приведенный ниже код помещает ввод в специальный файловый дескриптор DATA
, добавляя его после токена __DATA__
, но в реальном коде вы можете вызвать grouped_by_hour $fh
.
my %hour_names = grouped_by_hour \*DATA;
foreach my $hour (sort keys %hour_names) {
print "$hour:00:00 ", join(", " => @{ $hour_names{$hour} }), "\n";
}
__DATA__
10:00:00 Bob
11:00:00 Tom
11:00:20 Fred
11:00:40 George
12:00:00 Bill
Выход:
10:00:00 Bob
11:00:00 Tom, Fred, George
12:00:00 Bill