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


Доступ к элементам - часть 2


$name{$fh} = $filename;

}

print "open files: ", join(", values %name", "\n");

foreach $file(keys %name){

seek($file, 0, 2);

printf("%s is %d bytes long.\n", $name{$file}, $tell{$file});

}

Если в качестве ключа использована неопределенная величина undef, то она преобразуется в пустую строку. undef является вполне допустимым значением в хэше. Но при выборке значения для ключа, отсутствующего в хэше perl выдаст undef. Проверить наличие ключа можно так: exist($hash{$key}); определенность ассоциированного значения: defined($hash{$key}); истинность: if($hash{$key});. Иногда undef нужно сохранять в кэше, т.е. ключ есть, но с ним не связано ничего полезного, например программа, определяющая размер файлов из переданного списка:

%name =();

while(<>){

chomp;

next if exist $name{$_};

$name{$_} = -s $_;

}

Этот код позволяет пропустить несуществующие и нулевые файлы, но записанные в исходном списке.

Хэши с несколькими значениями, ассоциированными одним ключом. Т.к. скалярные величины, содержащиеся в хэше, могут быть ссылками(которые могут быть скалярами), то ассоциировать несколько значений одним ключом можно сохранив в $hash($key) ссылку на массив со значениями, ассоциированными с ключом $key. Операции с хэшами(вставка, удаление, перебор и проверка существования(undef)) переписываются для операций с массивами(push, splice и foreach). Пример, реализующий вставку в хэш(обрабатывает выходные данные команды who(1) и выводит краткий список пользователей с терминалами, на которых они зарегестрированы):

%ttys=();

open (WHO, "who|");

while(){

($user, $tty) = split;

push(@ {$ttys{$user}}, $tty);

}

foreach $user (sort keys %ttys){

print "$user: @{$ttys{$user}}\n"

}

в строке push содержится версия $tty{$user} = $tty для многозначного хэша. Все имена терминалов интерполируются в строке print @{$ttys{$user}}.

Пример программы, которая на название предмета выдает его свойство и наоборот:

#!/usr/bin/perl -w




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