defined

Синтаксис

defined EXPR
defined

Описание

Функция возвращает логическое значение, показывающее, имеет ли выражение EXPR значение, отличное от начального неопределенного значения undef. Если аргумент отсутствует, по умолчанию проверяется переменная $_.
Многие операции и функции возвращают undef, чтобы обозначить неудачу при выполнении операции, конец файла, системную ошибку, неинициализированную переменную и другие исключительные ситуации. Рассматриваемая функция позволяет вам отличить undef от других значений.
ПРИМЕЧАНИЕ
Дело в том, что простая логическая проверка не позволяет выявить различия между undef, нулем, пустой строкой и «0», которые представляют собой логический FALSE.

Поскольку undef представляет собой скаляр, его присутствие не обязательно обозначает исключительную ситуацию: pop возвращает undef, если ее аргумент представляет собой пустой массив либо когда возвращаемый элемент имеет значение undef.
Вы можете также использовать defined, чтобы проверить, существует ли определение необходимой вам подпрограммы. С другой стороны, применение defined к сложным структурам, таким как массивы и хэш-массивы, вовсе не гарантирует получения интуитивно понятных результатов, а поэтому таких приемов следует, по возможности, избегать.
При использовании элемента хэш-массива функция показывает вам, определено ли его значение, но не говорит о том, существует ли в хэш-массиве ключ. Для проверки существования элемента используется функция exists.
Например:
print if defined $switch{'D'};
print "$val\n" while defined ($val  = pop(@ary));
die "He могу считать readlink символа $sym: $!"unless defined($value =  readlink  $sym);
sub too { defined &$bar ? &$bar(@_) : die "Нет  bar"; }
$debugging = 0 unless defined $debugging;
Многие программисты злоупотребляют использованием функции defined и оказываются весьма обескураженными, когда обнаруживают, что число 0 и “” (пустая строка) являются фактически определенными значениями. Если, например, вы введете
"ab"  =~ /a(.*)b/;
сопоставление с шаблоном закончится успешно и переменная $1 будет считаться определенной, несмотря на тот факт, что сопоставление произведено с «ничем». Конечно, это «ничего» фактически представляет собой некий объект длиной в 0 символов. Может быть, эта концепция несколько сложна для понимания, но во всяком случае Perl ведет себя честно. Поэтому, когда функция возвращает неопределенное значение, это указывает на то, что честного сопоставления Perl найти не смог.
Все это означает, что вы должны использовать defined только в тех случаях, когда пытаетесь проверить целостность того, что вы собираетесь использовать. Во всех остальных случаях необходимо использовать простое сравнение с 0 или “”.
В настоящее время применение defined к целому массиву или хэш-массиву показывает, удалось ли выделить память, необходимую для хранения всей структуры данных. Поэтому массив, который вы инициализируете пустым списком, вначале рассматривается как неопределенный, а тот, который был заполнен, а потом ему в соответствие был приведен пустой список, по-прежнему будет считаться определенным. Поэтому вы можете использовать простой способ определения размера массива:
if (@an_array) { print "содержит  элементы массива\n" }
if (%a_hash) { print "содержит  элементы хэш-массива\n" }
Применение undef к этим структурам уничтожает выделенную область памяти, и последующие запросы отмечают структуры как неопределенные; вы не должны делать этого, если только не планируете использовать их повторно, поскольку затраты времени на повторное выделение памяти могут оказаться весьма значительными.



2011-04-26 00:53:16 lykich

Thanks




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: