Anda tidak perlu memeriksa setiap tingkat hierarki: Anda cukup memilih nilai yang Anda pedulikan. exists
tidak memeriksa definisi, hanya jika slot di hash ada (bisa ada dengan nilai yang tidak ditentukan), jadi jika Anda ingin nilainya ditentukan, Anda perlu memanggil defined
daripada ada. Jika suatu nilai tidak ditentukan, nilai tersebut akan dievaluasi dalam konteks boolean menjadi salah, sehingga kita dapat mengetikkan lebih sedikit dan mengurangi contoh Anda menjadi:
if ($Table{$key1}{$key2})
{
# do whatever
}
Namun, jika nilai dalam kunci tersebut ditentukan tetapi "salah" (secara numerik bernilai nol, atau berupa string kosong), hal ini dapat menyebabkan negatif palsu, jadi kita harus secara eksplisit memeriksa definisi apakah ini suatu kemungkinan:
if (defined $Table{$key1}{$key2})
{
# do whatever
}
Jika Anda tidak ingin menghidupkan $Table{$key1}
secara otomatis, Anda dapat memeriksa keberadaannya terlebih dahulu, yang membawa kita ke cara "terbaik" untuk kasus umum:
if (exists $Table{$key1} and defined $Table{$key1}{$key2})
{
# do whatever
}
Jika Anda akan sering melakukan ini untuk berbagai bidang dalam hash, Anda mungkin ingin menambahkan beberapa metode pengakses gaya OO yang akan melakukan pekerjaan ini untuk Anda:
sub has_field
{
my ($this, $fieldName) = @_;
return exists $this->{data} && defined $this->{data}{$fieldName});
}
Saya yakin Anda sudah membacanya, namun tidak ada salahnya untuk membaca kembali dokumentasi yang relevan:
Diberikan ekspresi yang menentukan elemen hash atau elemen array, exists
mengembalikan nilai true jika elemen yang ditentukan dalam hash atau array pernah diinisialisasi, bahkan jika nilai terkait tidak ditentukan. Elemen tidak akan dihidupkan secara otomatis jika tidak ada.
...
Elemen hash atau array bisa bernilai true hanya jika elemen tersebut didefinisikan, dan didefinisikan jika elemen tersebut ada, namun kebalikannya belum tentu benar.
person
Ether
schedule
27.04.2010