Оператор defined в Perl проверяет, определено ли значение (не является ли оно undef). Важно различать:
defined($x) вернет true, если $x не равен undef (независимо от значения, даже если это пустая строка или 0).defined($hash{$key}) проверяет, определено ли значение элемента, но не гарантирует, что сам ключ существует.defined($array[$i]) — аналогично, элемент может быть определен, но массив может быть длинее или короче.exists.Пример:
my %h = (a => undef); if (exists $h{a}) { print "Key 'a' exists "; } if (defined $h{a}) { print "Key 'a' is defined "; } else { print "Key 'a' not defined "; }
Результат:
Key 'a' exists
Key 'a' not defined
Чем отличается
exists $hash{$key}отdefined $hash{$key}и когда проверка на defined для хэша даст неожиданный результат?
Ответ: defined $hash{$key} проверяет значение, но если ключ не существует, выдаст неопределенное значение. Если ключ есть, но его значение undef, defined даст false. Но если ключа нет — также false. Поэтому для проверки существования ключа всегда используйте exists.
Пример:
my %h = (foo => undef); if (defined $h{foo}) { ... } # false if (exists $h{foo}) { ... } # true
История
В одном проекте проверяли флаг "готовности" как
defined($status{$id}), и если значением был undef, считали задачу не обработанной. Однако ключи с undef были валидны, а проверки на exists не было — как следствие, часть обработанных данных повторно запускали.
История
Программист, импортируя данные из файла, сравнивал строки так:
if (defined $line && $line ne ''). Проблема: иногда $line мог быть нулевой строкой '0'. Такая строка не пустая, но сравнение с defined (вместо проверки ne '') приводило к потере этих строк.
История
В большом Perl-скрипте, работавшем с хэшами, единственной проверкой существования элемента была defined — в результате для ключей со значением undef возникали баги и пропущенные данные в отчетах.