Dapat undef menjadi kunci hash di Perl?

Jawabannya adalah tidak ada.

undef tidak dapat hash key di Perl. Tapi ada kehalusan yang anda mungkin berpikir bahwa yang dapat. Rincian di bawah ini.

Apa hash

Salah satu struktur data yang ada dalam bahasa pemrograman Perl adalah hash. Hash adalah unordered set nilai-nilai. Berikut adalah contoh hash:

my %h = (
    aa => 1,
    bb => 2,
);

Hash ini disimpan dua pasang nilai. Kunci dengan nama 'aa' nilai yang disimpan 1, dan di kunci dengan nama 'bb' menyimpan nilai 2. Untuk mendapatkan nilai-nilai ini, digunakan sintaks $h{aa} dan $h{bb}.

Apa undef

undef adalah nilai khusus dalam Perl, yang berarti tidak ada nilai. Jika anda membuat variabel tetapi tidak menetapkan setiap nilai, nilainya akan hanya undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

Program ini akan menampilkan teks $VAR1 = undef;.

undef masih tersedia jika anda akses tidak ada elemen array atau tidak ada key dalam hash. Anda dapat secara eksplisit menetapkan undef variabel: $var = undef;.

Penggunaan yang tidak benar 1

Berikut ini adalah contoh program yang tampaknya undef mungkin key hash:

▶ Run
#!/usr/bin/perl

my %h = (
    undef => 'asdf',
);

print $h{undef};

Program menampilkan teks asdf. Yaitu seperti yang kami buat di hash key undef, dan kemudian saya mendapat nilai untuk kunci ini. Tapi itu tidak. Dalam contoh ini, nilai yang disimpan kunci 'undef', yaitu baris 'undef', tidak nyata undef.

Hal ini terjadi karena dua fitur.

Ketika anda membuat hash yang kita buat itu di sebuah pasangan kunci-nilai menggunakan kode undef => 'asdf',. Kode ini menggunakan operator =>. Keunikan ini pernyataan ini adalah bahwa dalam beberapa situasi, dia bisa mengambil apa yang tersisa sebagai string. Dia menyimpulkan seperti apa yang tersisa dari => dalam tanda kutip. undef => 'asdf', adalah benar-benar 'undef' => 'asdf',.

Fitur kedua adalah bagaimana kita mendapatkan nilai dari hash dengan kunci. Kita menggunakan sintaks $h{undef}. Dan kemudian Perl berpikir bahwa apa yang ada di dalam kurung kurawal adalah string. Apa yang telah kami tuliskan di sini adalah sama seperti $h{'undef'}.

Dapat yakin bahwa itu benar-benar adalah yang jika anda jalankan script dengan memasukkan modul khusus yang alih-alih menjalankan kode ini menunjukkan bagaimana Perl memahami kode ini. perl -MO=Deparse script.pl. Berikut adalah output:

my(%h) = ('undef', 'asdf');
print $h{'undef'};
script.pl syntax OK

Penggunaan yang tidak benar dari 2

Berikut ini contoh lain dari kode yang keliru berpikir bahwa undef dapat menjadi kunci hash. Oh, itu ada kami menggunakan real undef, tidak sesuai 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

my %h = (
    $var => 'asdf',
);

print $h{$var};

Program menampilkan teks asdf. Yaitu, apakah kita berpikir bahwa kita telah dibuat nilai hash dengan kunci undef.

Tapi benar-benar, kami telah menempatkan nilai dalam kunci '' (string kosong). Jika menambahkan ke akhir dari program ini line use Data::Dumper dan warn Dumper \%h;, setelah memulai di layar itu benar-benar tampak seperti hash:

$VAR1 = {
          '' => 'asdf'
        };

Variabel $var berisi nilai undef, tetapi bila digunakan dalam $var => 'asdf', dan $h{$var} undef diganti dengan string kosong ''.

Jika anda menambahkan kode use strict; dan use warnings; (yang hampir selalu layak dilakukan), maka dalam output akan terlihat bahwa Perl memperingatkan tentang penggunaan ini:

Use of uninitialized value $var in list assignment at script.pl line 8.
Use of uninitialized value $var in hash element at script.pl line 12.

Ringkasan

undef tidak menjadi nilai utama dalam Perl hash. Kunci dalam Perl hash adalah selalu sebuah garis. (Hanya menentukan bahwa string kosong '' juga dapat menjadi kunci). Dan nilai-nilai dalam hash dapat benar-benar ada dan tidak ada masalah yang harus undef.

Artikel lainnya