Существуют некоторые приемы, которые могут значительно упростить процесс.
Измените разделитель входных записей, чтобы вы сразу читали целые (многострочные) записи.Сделайте это с помощью $/
.
Получив многострочную запись, разбейте ее на строки.Вы знаете положение различных вещей в порядке строк.
Выведите результат при обработке каждой строки.Для этого вам не нужна структура данных.
Для более сложных вещей посмотрите на Text :: CSV_XS , чтобы справиться со сложностями файлов значений, разделенных запятыми.
$/ = "\n\n"; # record separator
while( <FILE> ) {
chomp;
my @lines = split /\n/;
my ($y, $m, $d, $time ) =
$lines[0] =~ /\A\#\d+\.\#(\d+)\s+(\d+)\s+(\d+)\s+([^#]+)/;
my $action = $lines[-2];
my $user = (split /\s+/, $lines[-1])[-1];
say join ';',
"$y/$m/$d",
$time,
$action,
$user
}
Но теперь давайте ответим на главный вопрос, который мог привести людей сюда.Вы хотите сохранить массив как хеш-значение.Это легко.Ссылка на массив (действительно, все ссылки) - это скаляры.Вы можете сделать то же самое, что вы можете сделать со скалярами, включая их использование в качестве хеш-значений:
my @array = ( ... );
my %hash;
$hash{'some_key'} = \@array; # take a reference to a named array
Вам не нужен именованный массив.[ ]
создает ссылку на массив напрямую:
$hash{'some_key'} = [ ... ]; # anonymous array constructor
Теперь у вас есть это значение ссылки на массив в качестве вашего хеш-ключа, и вы хотите с ним что-то делать с массивами.Сначала нужно разыменовать это.Поместите объект, который возвращает ссылку на массив, внутри @{ }
:
@{ $hash{'some_key'} }
Используйте его везде, где вы будете использовать именованный массив:
push @{ $hash{'some_key'} }, 'new value';
pop @{ $hash{'some_key'} };
Perl v5.24 имеет функция разыменования postfix , которая делает это немного красивее:
$hash{'some_key'}->@*
Используйте это вместо массива:
push $hash{'some_key'}->@*, 'newer value';
pop $hash{'some_key'}->@*;