好吧,我想应该澄清问题中的一些术语混淆。
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'
};
关键是第一个逗号后面的缺失值和undef
不一样,因为列表(任何列表)在 Perl 中会自动展平。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 {};