Работа с массивами
Иногда бывает необходимо преобразовать массив чего-либо
в хэш-массив. Это можно сделать так:
%hash = map { $_, 1 } @array;
Например:
%hash = map { $_, 1 } qw(a b c);
Этот оператор преобразует массив
('a', 'b', 'c')
в хэш-массив ('a',
1', 'b', 1, 'c', 1)
.
Автор: Joseph N. Hall
Предположим, мы имеем http log примерно следующего
содержания
gwa.fr.bosch.de - - [08/Jan/1998:01:50:42 -0700] "GET /ack.html HTTP/1.0" 200 6798
fwigka.admin.ch - - [08/Jan/1998:01:53:21 -0700] "GET /toc.html HTTP/1.0" 200 10002
и нам хочется сделать хэш-массив,
состоящий из первых слова каждой строки, а значением
элемента массива - количество повторений этого слова
@host{/^(\S+)/}++ while <>;
Этот же фрагмент кода можно переписать
и в более пространном виде
while (<>) { # Считываем одну строку в переменную $_
my ($addr) = /^(\S+)/; # Получаем первое слово строки
$host{$addr}++; # Увеличиваем счетчик повторений слова
}
Вот еще подобный фрагмент кода
%host = map {/^(\S+)/, 1} <>;
Но в этом случае содержимое всего файла
считывается в память (<> в контексте списка) перед
тем, как продолжить вычисления. Это, конечно, неудобно в
случае файла большого размера.
Автор: Joseph N. Hall
Инверсия хэш-массива один-к-одному
Предположим, мы
имеем следующий хэш-массив, содержащий информацию о
соответствии IP адресов и символьных имен
%num_to_host = (
'123.234.1.1' => 'george',
'123.234.1.2' => 'jane',
'123.234.1.3' => 'judy'
);
Таким образом, используя IP адрес в
качестве индекса мы можем получить его символьное имя. А
как сделать наоборот?
%host_to_num = reverse %num_to_host;
В случае хэш-массива с отношением
один-к-одному мы получим хэш-массив с обратным
соответствием, т.е. сможем определять IP адрес имея его
символьное имя.
('george' => '123.123.1.1',
'judy' => '123.234.1.3',
'jane' => '123.234.1.2')
Автор: Joseph N. Hall