2010-01-23 23 views
7

Tôi cần phải xác định xem một băm Perl có một khóa nhất định hay không, nhưng khóa đó sẽ được ánh xạ tới một giá trị không xác định. Cụ thể, động lực cho điều này là nhìn thấy nếu cờ boolean trong khi sử dụng getopt() với một tham chiếu băm được truyền vào nó. Tôi đã tìm kiếm cả trang web này và google và exists()defined() dường như không áp dụng được cho tình huống, họ chỉ thấy giá trị của một khóa nhất định không được xác định, họ không kiểm tra xem băm có thực sự có Chìa khóa. Nếu tôi là một RTFM ở đây, xin vui lòng chỉ cho tôi hướng dẫn giải thích điều này.Làm cách nào để xác định xem một băm Perl có chứa ánh xạ khóa tới giá trị không xác định?

Trả lời

26

tồn tại() và xác định() dường như không được áp dụng cho tình hình, họ chỉ nhìn thấy nếu giá trị cho một chìa khóa nhất định là không xác định, họ không kiểm tra xem mã băm có thực sự có khóa hay không

không chính xác. Đó thực sự là những gì defined() có, nhưng exists() thực hiện chính xác những gì bạn muốn:

my %hash = (
    key1 => 'value', 
    key2 => undef, 
); 

foreach my $key (qw(key1 key2 key3)) 
{ 
    print "\$hash{$key} exists: " . (exists $hash{$key} ? "yes" : "no") . "\n"; 
    print "\$hash{$key} is defined: " . (defined $hash{$key} ? "yes" : "no") . "\n"; 
} 

sản xuất:

 
$hash{key1} exists: yes 
$hash{key1} is defined: yes 
$hash{key2} exists: yes 
$hash{key2} is defined: no 
$hash{key3} exists: no 
$hash{key3} is defined: no 

Các tài liệu cho hai chức năng này có sẵn tại dòng lệnh tại perldoc -f definedperldoc -f exists (hoặc đọc tài liệu cho tất cả các phương pháp tại perldoc perlfunc *). Các tài liệu web chính thức là ở đây:

* Vì bạn đặc biệt đề cập RTFM và bạn có thể không nhận thức được vị trí của các tài liệu Perl, hãy để tôi cũng chỉ ra bạn có thể lấy chỉ mục đầy đủ của tất cả các perldocs tại perldoc perl hoặc tại http://perldoc.perl.org.

11

Nếu tôi đọc chính xác câu hỏi của bạn, tôi nghĩ bạn đang nhầm lẫn về exists. Từ các tài liệu:

tồn tại EXPR

Với một biểu thức mà xác định một yếu tố băm hoặc phần tử mảng, trả đúng nếu các yếu tố quy định tại các băm hoặc mảng đã từng khởi tạo, ngay cả khi giá trị tương ứng không xác định.

Ví dụ:

use strict; 
use warnings; 

my %h = (
    foo => 1, 
    bar => undef, 
); 

for my $k (qw(foo bar baz)){ 
    print $k, "\n" if exists $h{$k} and not defined $h{$k}; 
} 
6

Câu trả lời ngắn:

if (exists $hash{$key} and not defined $hash{$key}) { 
    ... 
} 
Các vấn đề liên quan