さて、明確にすべき質問には、用語の混乱があると思います。
Perlのハッシュには、常に同じ数のキーと値があります。これは、基本的に、キーによっていくつかの値を格納するエンジンだからです。つまり、ここではキーと値のペアを単一の要素と見なす必要があります。)。
しかし、それは実際に求められたものではないと思います。)OPがリスト(配列ではなく、違いは微妙ですが、まだそこにあります)からハッシュを作成しようとし、警告が表示されたと思います。
したがって、ポイントは、ハッシュに割り当てられるリスト内の要素の数を確認することです。それは簡単に行うことができます...
my @list = ( ... there goes a list ... );
print @list % 2; # 1 if the list had an odd number of elements, 0 otherwise
%
演算子がリスト変数にスカラーコンテキストを課していることに注意してください。これはシンプルでエレガントです。)。
私が見るように更新してください、問題はわずかに異なります。さて、与えられた例について話しましょう。少し単純化してみましょう。
my $anhash = {
option1 =>,
option2 => undef,
option3 => 'fast'
};
ほら、=>
これは単なるシンタックスシュガーです。この割り当ては、次のように簡単に書き直すことができます...
my $anhash = {
'option1', , 'option2', undef, 'option3', 'fast'
};
重要なのは、リスト(任意のリスト)がPerlで自動的にフラット化されるため、最初のコンマの後に欠落している値undef
が同じではないということです。undef
任意のリストの通常の要素にすることができますが、空のスペースは無視されます。
参照でラップされた無効なハッシュを使用してプロシージャが呼び出された場合、プロシージャが呼び出される前に、気になる警告(use warnings
が設定されている場合)が発生することに注意してください。したがって、これを引き起こした人は誰でも、自分のコードを見て、自分で対処する必要があります。早期に失敗する、と彼らは言います。)。
名前付き引数を使用したいが、欠落している引数にいくつかのデフォルト値を設定しますか?この手法を使用します。
sub test_sub {
my ($args_ref) = @_;
my $default_args_ref = {
option1 => 'xxx',
option2 => 'yyy',
};
$args_ref = { %$default_args_ref, %$args_ref, };
}
次に、test_subは次のように呼び出される可能性があります...
test_sub { option1 => 'zzz' };
... あるいは ...
test_sub {};