Отправляет email-рассылки с помощью сервиса Sendsay

Perl - подпишись и учись!

  Все выпуски  

Perl - подпишись и учись!


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

 Hi, All!  
    Приветствую всех!
    С документацией о хэшах в прошлом выпуске закончили. Сегодня поговорим об использовании и применении хэшей.
После того как вы создали хэш, можно работать с ним, обращаясь к его злементам с помощью ключей:
$value = $hash{$key};
В списковом контексте хэш интерполируется: пары ключ/значение переходят в единый список злементов. В скалярном контексте подставляется значение истина (true), если в хэше есть хотя бы одна пара ключ/значение, и ложь (false), если хэш пуст. Чтобы добавить новый злемент (то есть пару ключ/значение) в хэш, используйте оператор присвоения. В следующем примере в хэш %hash добавляются два значения:
%hash =();
$hash{$key} = fvalue;
$hash{fkey2} = $value2;
Хэши можно создавать, используя присвоение списка, и точно так же можно добавлять новые злементы. В следующем примере таким образом к хэшу %hash добавляется новая пара ключ/значение:
%hash = ( one    => 1, two => 2, three    => 3 );
$hash = ($hash, four, '4');
print $hash{four};
Результат:
4
Этот пример работает, потому что оператор списка () сперва интерполирует хэш %hash в список, а затем последний расширяется еще на одну пару ключ/значение. Из-за интерполяции, которая происходит до присвоения списком, в данном случае нельзя использовать сокращенную форму с оператором +=:
%hash += (four, '4');#это не работает
Чтобы проверить, єсть ли в хэше некоторый злемент, можно использовать функцию exists. Например, в следующем примере в хэше %hash ищется злемент с ключом vegetable:
$hash{fruit} = apple;
$hash{sandwich} = hamburger;
$hash{drink} = bubbly;
if (exists($hash{"vegetable"})) {
рrint "Element exists.";}
else { print "Element does not exist."}
Результат:
Element does not exist
Чтобы удалить злемент нз хэша, используется функция delete. В этом примере удаляется злемент хэша и затем проверяется, существует ли еще такой злемент:
$hash{fruit} = apple;
$hash{sandwich} = hamburger;
$hash{drink} = bubbly;
delete ($hash{"fruit"});
if (exists($hash{"fruit"})) {
print "Element exists."; }
else {
print "Element does not exist."; }
Результат:
Element does not exist
Существует множество способов организации цикла по злементам хэша. Функция each позволяет использовать записи хэша (то есть и ключ, и значепие) целиком. Рассмотрим пример. Сначала создадим хэш-таблицу:
$hash{fruit} = apple;
$hash{sandwich} = hamburger;
Теперь можно извлечь из нее пары ключ/значенне, используя функцию each н присвоение списком:
$hash{frult} = apple;
$hash{sandwich} = hamburger;
$hash{drink} = bubbly;
while (($key, $value) = each($hash)){
print "$key => $value\n";
Результат: 
drink => bubbly
sandwich => hamburger
fruit => apple
Использованне each в данном случае полезно, так как для каждого злемента хэша при одном ее вызове возвращается как ключ, так и значение. Кстати, элементы хэша извлекаются не в том порядке, в каком они заносились. Дело в том, что Perl хранит их, используя собственный внутренний алгоритм, оптимизирующий затраты памяти и обеспечивающнй лёгкость доступа. При работе с элементамн хэша можно использовать цикл foreach. Например, совместно с функцией keys, возвращаюшей список ключей хэша, он позволяет последовательно перебрать весь хэш:
$hash{fruit} = apple;
$hash{sandwich} = hamburger;
$hash{drink} == bubbly;
foreach $key (keys %hash){
print $hash{$key} . "\n";}
Результат: 
bubbly
hamburger
apple
Однако, вместо keys можно сразу воспользоваться функцией values. Она возвращает список значений, хранящихся в хэше. С ней цикл, выводящий все значення хэша, принимает следующий вид:
$hash{fruit} = apple;
$hash{sandwich} = hamburger;
$hash{drink} = bubbly;
foreach $value (values %hash){
print "$value\n"; }
Результат: 
bubbly
hamburger
apple
Как видите, несмотря на то, что к элементам хэша нельзя получить доступ с помощью числового индекса. Perl предоставляет достаточно средств для их перебора.
Чтобы вывести содержимое хэша, можно интерполировать его в строку, заключенную в двойные кавычки:
$hash{fruit} = apple;
$hash{sandwich} = hamburger;
$hash{drink} = bubbly;
print '@{[%hash]}\n";
Результат:
drink bubbly sandwich hamburger fruit apple
В результате такой печати хэш переведён в списковый контекст, то есть представлен в виде пар ключ/значение, расположенных друг за другом. Функция each в данной ситуации дает более удачное решение:
$hash{fruit} = apple;
$hash{sandwich} = hamburger;
$hash{drink} = bubbly;
while (($key, $value) = each(%hash)){
print "$key: $value\n";}
Результат:
drink: bubbly
sandwich: hamburger
fruit: apple
________________________________________
В составлении выпуска были использованы материалы книги Стивена Холзнера(Steven Holzner) "Perl. Core Language. Little Black Book", а также документация, прилагаемая к самому PERLу. ________________________________________
И ещё, если у вас есть вопросы, то задавайте их на форуме сайта(http://perl.bos.ru).
________________________________________
                С уважением, Дмитрий.

Another Banner Network

http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное