Perl ハッシュに未定義の値へのキー マッピングが含まれているかどうかを確認するにはどうすればよいですか?
質問
Perl ハッシュに特定のキーがあるかどうかを確認する必要がありますが、そのキーは undef 値にマップされます。具体的には、この動機は、使用中にブールフラグがあるかどうかを確認することです。 getopt()
ハッシュ参照が渡されます。このサイトとグーグルの両方ですでに検索しましたが、 exists()
そして defined()
この状況には当てはまらないようです。指定されたキーの値が未定義かどうかを確認するだけで、ハッシュに実際にキーがあるかどうかは確認しません。私がここで RTFM をしている場合は、これを説明しているマニュアルを教えてください。
解決
存在する()と定義された()は、この状況には適用できないようです。指定されたキーの値が未定義かどうかを確認するだけで、ハッシュに実際にキーがあるかどうかはチェックしません
正しくない。それは確かに何ですか defined()
そうですが、 exists()
まさにあなたが望むことを行います:
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";
}
生成されるもの:
$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
これら 2 つの関数のドキュメントは、次のコマンドラインから入手できます。 perldoc -f defined
そして perldoc -f exists
(または、次の場所にあるすべてのメソッドのドキュメントを参照してください。 perldoc perlfunc
*)。公式 Web ドキュメントはここにあります。
*特に RTFM について言及しましたが、Perl ドキュメントの場所をご存じないかもしれません。すべての Perldoc の完全なインデックスは次の場所で入手できることも指摘しておきます。 perldoc perl
または http://perldoc.perl.org.
他のヒント
は、私はあなたがについて混乱していると思います。。ドキュメントから:
例えば、EXPR
が存在します式を指定Aのことを考えます ハッシュの要素や配列要素、リターン trueの場合で指定された要素 ハッシュや配列は、これまでとなっています 初期化され、対応する場合でも、 値が定義されています。
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};
}
短い答えます:
if ( exists $hash{$key} and not defined $hash{$key} ) {
...
}