?

Log in

No account? Create an account

Знаете, чем отличается Perl от латыни?

Имеется хэш хэшей. Надо этот самый хэш перебрать, получить пары ключ-вложенный хэш и что-нибудь с этими парами сделать. Задача элементарная и на ПХП решается следующим образом:


foreach($arr as $k => $v) {
echo $k . ' — ' . $v['нужныйключик'];
}


Получаем две переменные: $k, которая является ключом для вызова вложенного хэша, и $v, вложенный хэш, из которого уже по его ключам достается все необходимое. Просто, не правда ли?

Справедливости ради следует заметить, что в Перле эта задача тоже элементарно решается с использованием того же оператора foreach и решение выглядит даже несколько более элегантно. Но лишь до поры, до времени.

Дело в том, что хэш в Перле кладет на порядок чередования своих элементов. Полагаю, что в целях ускорения работы. Решением может стать создание в том или ином виде списка, где уже хранить тупо ключики в нужном порядке, но это дублирование кода. Можно еще использовать модуль Tie::IxHash, который создает специальные хэши, но они более тормозные, да и хочется все-таки простого решения. И оно есть. Сначала хэш превращается в обычный массив (который [], но с ключами), а затем выполняется следующий экзорцизм:


for (my $i = 0; $i < @{$arr}; $i+=2) {
print $arr[$i] . ' — ' . $arr[$i + 1]->{'нужныйключик'};
}


Получаем две конструкции: $arr[$i] — текущий ключ хэша в цикле и $arr[$i + 1] — вложенный хэш, из которого по ключику можно уже что-нибудь достать. Сразу же после этого есть риск получить по шее от первого же перл-программиста, который сие безобразие увидит.


P.S:

А Перл от латыни отличается тем, что на латыни дьявола можно вызвать, а на перле — напрограммировать.

Comments