私は常に if ステートメントで exists と defined を使用しています
if (exists($a->{b}) and defined($a->{b})
これらの両方を同時に行うサブルーチンはありますか?
更新:
あまり良いサンプル コードを提供していないようです。より良い質問と一致する回答については、checking-for-existence-of-hash-key-creates-key を確認してください。
私は常に if ステートメントで exists と defined を使用しています
if (exists($a->{b}) and defined($a->{b})
これらの両方を同時に行うサブルーチンはありますか?
更新:
あまり良いサンプル コードを提供していないようです。より良い質問と一致する回答については、checking-for-existence-of-hash-key-creates-key を確認してください。
それは同じことです
if (defined($a->{b}))
コメントでの返信についてはdefined
、キーをインスタンス化していません。
>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
->
、一方、通常どおり自動活性化します。
>perl -E"if (defined($a->{b})) { } say $a || 0;"
HASH(0x3fbd8c)
しかし、それexists
もそうです。
>perl -E"if (exists($a->{b}) and defined($a->{b})) { } say $a || 0;"
HASH(0x81bd7c)
自動有効化を回避しようとしている場合は、次を使用します
>perl -E"if ($a && defined($a->{b})) { } say $a || 0;"
0
また
>perl -E"no autovivification; if (defined($a->{b})) { } say $a || 0;"
0
defined(...)
が true の場合にのみ true になる可能性があるexists(...)
ため、質問に対する答えは、サブルーチンが呼び出されるということdefined
です。
キーが存在するかどうかのみを確認したい場合 (未定義であっても)、exists()を使用します。
これは、それを非常にうまく説明する関連する質問です:存在と定義の違いは何ですか?