PERL - Полезные советы
  • Работа с массивами

    Иногда бывает необходимо преобразовать массив чего-либо в хэш-массив. Это можно сделать так:

    
            %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