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


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


Элемент $age{ Unborn } проходит только проверки существования и опреде­ленности Он существует, потому что ключу Unborn было присвоено значение в хэше, и определен, потому что это значение не равно undef Однако он не явля­ется истинным, потому что 0 интерпретируется в Perl как одна из ложных вели­чин

Элемент $age{ Phantasm } проходит только проверку существования Он суще­ствует, потому что ключу Phantasm было присвоено значение в хэше Поскольку это значение представляет собой undef, проверка определенности не работает Так как undef также считается в Perl одним из ложных значений, проверка истин­ности тоже не работает

Наконец, $age{ Relic } не проходит ни одну из проверок Значение для   Relic не заносилось в хэш, поэтому проверка на существование завершается неудачей Из-за отсутствия ассоциированного значения попытка обратиться к $age{ Relic } дает undef Как мы знаем из примера с   Phantasm , undef не проходит проверки определенности и истинности

Иногда undef полезно сохранить в хэше Это означает «такой ключ встречает­ся, но с ним не связано никакого полезного значения» Например, рассмотрим программу, которая определяет размер файлов из переданного списка Следующий фрагмент пытается пропускать файлы, которые уже встречались в списке, однако это не касается файлов нулевой длины и встречавшихся ранее несуществующих файлов

%name = () while (<>) {

chomp

next if $name{$_}   # НЕВЕРНО i

$name{$_} = -s $_


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

Замена неправильной строки следующим вызовом exists позволяет пропускать нулевые и несуществующие файлы:

next if exists $name{$_},

В самом первом примере предполагается, что все, что не является едой (food), относится к напиткам {dunk). В реальном мире подобные допущения весьма опасны

> Смотри также---------------------------------------------------------------------------------------------

Описание функций exists и defined в perlfunc(i). Концепция истинности рассматривается в разделе «Scalar Values»perldala(l).




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