PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 166


Tubalcain => Lamech , Enos     => Seth )

Например, мы можем легко построить генеалогическое дерево любого персо­нажа:

while (о)    { chomp, do {


5.15. Представление отношений между данными    173

print $_ ,    # Вывести текущее имя $_ = $father{$_}, # Присвоить $_ отца $_ } while defined,    # Пока отцы находятся print \п , }

Просматривая хэш %father, можно отвечать на вопросы типа: «Кто родил Сета?» При инвертировании хэша отношение заменяется противоположным Это позво­ляет использовать рецепт 5.8 для ответов на вопросы типа: «Кого родил Ламех?»

while ( ($k, $v) = each %father ) { push( @{ $children{$v} }, $k )

$ = ,        й Выходные данные разделяются запятыми while (о) {

chomp

if ($children{$J)  {

(^children = @{$children{$_}}

} else {

©children = nobody

}

print    $_ begat (^children \n , }

Хэши также могут представлять такие отношения, как директива «include язы­ка С — А включает В, если А содержит ttinclude В Следующий фрагмент строит хэш (он не проверяет наличие файлов в /usr/include, как следовало бы, но этого можно добиться ценой минимальных изменений):

foreach $file (@files)   {

local *F,                        # На случай   если понадобится

tt локальный файловый манипулятор unless (open (F,    <$file ))  {

warn    Couldn t  read file    $'    skipping \n , next,

while (<F>) {

next unless /"\s*#\s+include\s+<([~>\+)>/, push(@{$includes{$1}} $file), }

close F, }

Другой фрагмент проверяет, какие файлы не включают других:

<3>mclude_fгее = ()     # Список файлов, не включающих других файлов @umq{map { @$_ } values %includes} = undef foreach $file (sort keys %umq) {

push( @include_free , $file ) unless $mcludes{$file}


174   Глава 5 • Хэши

Результат values %includes представляет собой анонимный массив, посколь­ку один файл может включать (и часто включает) сразу несколько других фай­лов. Мы используем тар для построения большого списка всех включенных фай­лов и удаляем дубликаты с помощью хэша.




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