Używam istnieje i zdefiniowałem w instrukcji if cały czas
if (exists($a->{b}) and defined($a->{b})
czy istnieje podprogram, który wykonuje oba te zadania jednocześnie?
AKTUALIZACJA:
Wydaje się, że nie podałem bardzo dobrego przykładowego kodu. Aby uzyskać lepsze pytanie i dopasować odpowiedź, sprawdź sprawdzanie-istnienia-klucza-skrótu-tworzy-klucz.
Odpowiedzi:
2 dla odpowiedzi № 1defined(...)
może być prawdziwe tylko wtedy, gdy exists(...)
jest prawdą, więc odpowiedź na twoje pytanie brzmi, że wywoływany jest podprogram defined
.
6 dla odpowiedzi nr 2
To tak samo jak
if (defined($a->{b}))
Jeśli chodzi o odpowiedź w komentarzach, defined
nie tworzy instancji kluczy.
>perl -E"if (exists($a->{b}) and defined($a->{b})) { } say 0+keys(%$a);"
0
>perl -E"if (defined($a->{b})) { } say 0+keys(%$a);"
0
->
, z drugiej strony, autowirusa normalnie.
>perl -E"if (defined($a->{b})) { } say $a || 0;"
HASH(0x3fbd8c)
Ale tak jest w przypadku exists
także.
>perl -E"if (exists($a->{b}) and defined($a->{b})) { } say $a || 0;"
HASH(0x81bd7c)
Jeśli starasz się uniknąć autoweryfikacji, użyjesz
>perl -E"if ($a && defined($a->{b})) { } say $a || 0;"
0
lub
>perl -E"no autovivification; if (defined($a->{b})) { } say $a || 0;"
0
1 dla odpowiedzi nr 3
- istnieje () sprawdza, czy klucz istnieje (nawet jeśli wartość undef)
- zdefiniowane () sprawdza, czy istnieje zdefiniowana wartość
jeśli chcesz tylko sprawdzić, czy klucz istnieje (nawet jeśli undef), po prostu użyj istnieje ()
oto pytania pokrewne, które wyjaśniają to całkiem ładnie: Jaka jest różnica między istnieje a zdefiniowana?