В примере кода, который вы нашли, часть <I>
читает весь файл и возвращает список в grep. grep обрабатывает список и передает его на карту. Затем Map создает свой собственный список, и этот список присваивается хешу.
Когда вы назначаете список хешу, предполагается, что этот список является четным списком пар ключ / значение.
Неважно, откуда появился этот список, это может быть вывод команды map, grep или split. Это может быть прямо из файла, оно может храниться в массиве.
Ваша линия:
my $HASH = ();
Ничего полезного не делает. Написание my $HASH;
точно так же.
На данный момент, $HASH
не определено. Если у вас есть неопределенное значение и вы разыменовываете его как хеш, %$HASH
, неопределенное значение станет хешем.
Вы можете сделать это явно, написав:
my $HASH = {}; # note the curly braces and not parens
Если у вас есть список пар ключ-значение в массиве:
%$HASH = @array;
Если у вас есть список ключей и список значений:
@$HASH{@keys} = @values;
По вашему вопросу, вот один простой способ создать ваш хэш из массива при фильтрации значений:
my $HASH = {};
my $ARRAY = [ qw(key1 val1 key2 val2 __key3__ val3 __key4__ val4) ];
{my @list = @$ARRAY; # make a copy since splice eats the list
while (my ($k, $v) = splice @list, 0, 2) {
if ($k =~ /^__(.+)__$/) {
$$HASH{$1} = $v
}
}
}
use Data::Dumper;
print Dumper($HASH);
который печатает:
$VAR1 = {
'key4' => 'val4',
'key3' => 'val3'
};
Если вы хотите сделать все это в одной строке, вы можете использовать функцию mapn
из моего модуля List :: Gen , которая похожа на map
, но которая позволяет вам перемещаться список с любым желаемым размером шага, а не один элемент за раз.
use List::Gen 'mapn';
%$HASH = mapn {/^__(.+)__$/ ? ($1, $_[1]) : ()} 2 => @$ARRAY;