10

Perl ハッシュに特定のキーがあるかどうかを判断する必要がありますが、そのキーは undef 値にマップされます。getopt()具体的には、これの動機は、渡されたハッシュ参照を使用しているときにブール値フラグを確認することです。私はすでにこのサイトとグーグルの両方を検索しましたが、このexists()状況defined()には当てはまらないようです。特定のキーの値が未定義であるかどうかを確認するだけで、ハッシュに実際にキーがあるかどうかを確認しません。ここで RTFM を使用している場合は、これについて説明しているマニュアルを参照してください。

4

3 に答える 3

28

exists() と defined() はこの状況には当てはまらないようです。指定されたキーの値が未定義かどうかを確認するだけで、ハッシュが実際にキーを持っているかどうかを確認しません。

正しくない。それは実際に行うことです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} が存在します: はい
$hash{key1} が定義されています: はい
$hash{key2} が存在します: はい
$hash{key2} が定義されています: いいえ
$hash{key3} が存在します: いいえ
$hash{key3} が定義されています: いいえ

これら 2 つの関数のドキュメントは、コマンドラインのperldoc -f definedおよびにあります (または、 *perldoc -f existsのすべてのメソッドのドキュメントを参照してください)。perldoc perlfunc公式の Web ドキュメントは次の場所にあります。

*あなたは特に RTFM について言及しており、Perl のドキュメントの場所を知らないかもしれないので、すべての perldocs の完全なインデックスhttp://perldoc.perl.orgで入手できることも指摘しておきます。perldoc perl

于 2010-01-23T23:09:21.143 に答える
11

私があなたの質問を正しく読んでいれば、existsについて混乱していると思います。ドキュメントから:

EXPRが存在する

ハッシュ要素または配列要素を指定する式を指定すると、対応する値が未定義であっても、ハッシュまたは配列内の指定された要素が初期化されていれば 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};
}
于 2010-01-23T22:31:48.790 に答える
6

簡潔な答え:

 if ( exists $hash{$key} and not defined $hash{$key} ) {
    ...
 }
于 2010-01-24T02:12:13.840 に答える