Có thể undef là một băm chìa khóa trong Perl?

Câu trả lời là không.

undef không thể được một băm chìa khóa trong Perl. Nhưng có sự tinh tế mà bạn có thể nghĩ rằng có thể. Chi tiết sau.

Là gì băm

Một trong những cấu trúc dữ liệu có tồn tại trong những ngôn ngữ Perl là băm. Một băm là một cách có thứ tự bộ giá trị. Đây là một ví dụ băm:

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

Băm này được lưu trữ hai cặp giá trị. Chính với những tên 'aa' giá trị được lưu trữ 1, và trong chính với những tên 'bb' cửa hàng giá trị 2. Để có được những giá trị này, sử dụng cú pháp $h{aa}$h{bb}.

Là gì undef

undef là một giá trị đặc biệt trong Perl, có nghĩa là không có giá trị. Nếu bạn tạo ra những biến nhưng không phải gán cho nó có giá trị, giá trị của nó sẽ chỉ undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

Chương trình sẽ hiển thị các văn bản $VAR1 = undef;.

undef là vẫn còn sẵn nếu bạn truy cập vào không tồn tại mảng tố hay một người không tồn tại chìa khóa trong một băm. Bạn rõ ràng có thể gán undef biến: $var = undef;.

Không đúng cách sử dụng 1

Đây là một mẫu chương trình mà có vẻ undef có thể là chìa khóa băm:

▶ Run
#!/usr/bin/perl

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

print $h{undef};

Chương trình hiển thị các văn bản asdf. Tức là, giống như chúng ta được tạo ra trong băm chìa khóa undef, và sau đó, tôi có giá trị cho khóa này. Nhưng nó không phải. Trong ví dụ này, các giá trị được lưu trữ chìa khóa 'undef', tức là hàng 'undef', không phải là một thực undef.

Điều này xảy ra do để hai năng.

Khi bạn tạo băm chúng ta tạo ra nó trong một vài chìa-giá trị bằng cách sử dụng mã undef => 'asdf',. Mã này sử dụng điều hành =>. Các đặc thù của đây những tuyên bố là trong một số tình huống, anh có thể lấy những gì còn lại như một chuỗi. Anh ta kết luận như là những gì còn lại của => trong dấu nháy. undef => 'asdf', thực sự 'undef' => 'asdf',.

Các năng thứ hai là làm thế nào chúng ta nhận được giá trị từ băm bởi chìa khóa. Chúng tôi sử dụng các cú pháp $h{undef}. Và sau đó Perl nghĩ rằng đó là những gì trong curly là một chuỗi. Những gì chúng ta đã được viết ở đây là giống như $h{'undef'}.

Có thể chắc chắn rằng nó thực sự là, nếu như bạn chạy kịch bản của cắm một mô-đun đặc biệt mà thay vì thực hiện mã cho thấy làm thế nào Perl hiểu mã này. perl -MO=Deparse script.pl. Đây là kết quả:

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

Không chính xác sử dụng 2

Đây là một ví dụ khác của mã mà nhầm lẫn nghĩ rằng undef có thể là chìa khóa băm. Oh, nó ở đó chúng tôi sử dụng thực undef, không dòng 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

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

print $h{$var};

Chương trình hiển thị các văn bản asdf. Tức là, chúng ta nghĩ rằng chúng tôi đã tạo ra các giá trị trong băm bởi chính undef.

Nhưng thực sự, chúng tôi đã đặt giá trị trong chìa khóa '' (một chuỗi rỗng). Nếu thêm vào cuối của chương trình này dòng use Data::Dumperwarn Dumper \%h;, sau khi bắt đầu vào màn hình mà thực sự trông giống như một băm:

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

Biến $var có một giá trị undef, nhưng khi được sử dụng trong $var => 'asdf',$h{$var} undef bị thay thế bởi một chuỗi rỗng ''.

Nếu bạn thêm vào mã use strict;use warnings; (đó gần như là luôn luôn có giá trị làm), sau đó trong đầu ra, nó sẽ được nhìn thấy rằng Perl cảnh báo về việc sử dụng này:

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.

Tóm tắt

undef không thể có một giá trị của một chìa khóa trong Perl băm. Chìa khóa trong một Perl băm luôn là một đường dây. (Xác định chỉ có một chuỗi rỗng '' cũng có thể là chìa khóa). Và giá trị trong băm có thể hoàn toàn bất kỳ và không có vấn đề để được undef.

Các bài viết khác