Создание серверных приложений на языке PERL


Хэши slice


(перевод, статья находится по адресу http://www.sysarch.com/perl/tutorials/hash_slices.txt)


Насколько хорошим является этот код??

@array = qw( a b c d ) ;

@array{ @array } = ( [ @array ] ) x @array ;

Основное определение хэша slice: @hash{ @array } = ( list ) что эквивалентно ( $hash{ $array[0] }, ... $hash{ $array[$#array] } ) = ( list ) Префиксный символ (@ ,%) используется только для обозначения контекста, но не типа данных. Если имеются два массива и мы ходим сопоставлять их данные, то мы поступаем так:

@foo_array = qw( abc def ghi ) ;

@bar_array = qw( jkl mno pqr ) ;

@foo_to_bar{ @foo_array } = @bar_array

теперь можно работать с массивами немного проще:

$foo_value = 'def' ;

$bar_value = $foo_to_bar{ $foo_value } ;

Можно даже сразу преобразовывать целый массив переменных foo одной конструкцией: @bar_values = @foo_to_bar{ @foo_values }; Еще одно использование хэша slice, производится проверка: находится ли строка в данном массиве строк? Фактически мы не заботимся о том, что находится в хеше slice, но 1 используется для большей ясности.

@foo_array = qw( abc def ghi ) ;

@is_a_foo{ @foo_array } = (1) x @foo_array ;

$input = 'def' ;

if ( $is_a_foo{ $input } ) {

...

if ( exists( $is_a_foo{ $input } ) ) {

...

Оператор x называется оператором повторения, он дублирует левый операнд значением правого операнда. В скалярном контексте он копирует левый оперант как строку и возвращает его, т.е. мы имеем контекст списка и левый операнд списка. Это позволяет создать новый список с N копиями предыдущего списка. Для foo N = 3 и (скалярное значение @foo_array) и мы получаем список (1, 1, 1) который присваивается хешу slice. Программа, преобразующая строки в нумерованные индексные значения. Используется оператор диапазона (..), создающий список целых чисел, которые присваиваются хэшу slise:

@foo_array = qw( abc def ghi ) ;

@foo_to_index{ @foo_array } = ( 0 .. $#foo_array ) ;

@foo_to_index{ @foo_array } = ( 1 .. @foo_array ) ;

$i_am_a_foo = 'def' ;

$foo_index = $foo_to_index{ $i_am_a_foo } ;




Начало  Назад  Вперед



Книжный магазин