В Perl, когда вам нужно использовать строку в качестве ключа в структуре данных, вы ищете встроенный тип HASH
, обозначенный символом %
.Приятной особенностью хэшей Perl является то, что вам не нужно предварительно объявлять сложную структуру данных.Вы можете использовать его, и Perl выведет структуру из этого использования.
my @file = qw(ipax3_2011_01_27.txt ipax3_2011_02_01.txt ipax3_2011_02_03.txt);
my %ipax3;
for (@file) {
if (/^ipax3_(\d{4}_\d{2})_(\d{2}).txt$/) {
$ipax3{$1}{$2} = $_
}
else {
warn "bad file: $_\n"
}
}
for my $year_month (keys %ipax3) {
my $days = keys %{ $ipax3{$year_month} };
if ($days > 1) {
print "$year_month has $days files\n";
}
else {
print "$year_month has 1 file\n";
}
}
, которая печатает:
2011_01 has 1 file
2011_02 has 2 files
Чтобы получить в отдельных файлах:1011 * Выше я использовал возвращаемое значение функции keys
как итерацию списка, так и количество дней.Это возможно, потому что keys
вернет все ключи в контексте списка и вернет количество ключей в скалярном контексте.Контекст обеспечивается окружающим кодом:
my $number = keys %ipax3; # number of year_month entries
my @keys = keys %ipax3; # contains ('2011_01', '2011_02')
my @days = keys %{ $ipax{$year_month} };
В последнем примере каждое значение в %ipax
является ссылкой на хеш.Так как keys
принимает буквальный хеш, вам нужно обернуть $ipax{$year_month}
в %{ ... }
.В perl v5.13.7 + вы можете опустить %{ ... }
вокруг аргументов keys
и некоторые другие функции доступа к структуре данных.