我希望只有在我有一个要分配的定义值时才在哈希中创建一个键/值对。
我目前正在这样做:
$hash{key1} = $val1 if defined $val1;
这没关系 - 但是当$val1
复杂时会变得烦人。有没有办法让我可以巧妙地得到相同的结果,而不必说$val1
两次?下面的测试脚本可能有助于澄清我想要实现的目标。
use strict;
use warnings;
use Test::More tests => 1;
my %hash;
my $val1 = undef; # Explicitly undef
my $val2 = 10;
$hash{key1} = $val1 if defined $val1;
$hash{key2} = $val2 if defined $val2;
my %expected = ('key2', 10);
is_deeply(\%hash, \%expected, 'Hashes compare');
答案 0 :(得分:3)
如果要检查许多此类值,可以使用grep / list:
use strict;
use warnings;
my %hash;
my $val1 = undef;
my $val2 = 10;
$hash{$_->[0]} = $_->[1] for grep { defined $_->[1] }
['key1', $val1], ['key2', $val2];
或者您可以在盲目填充哈希后过滤哈希:
$hash{key1} = $val1;
$hash{key2} = $val2;
%hash = map { $_, $hash{$_} } grep { defined $hash{$_} } keys %hash;
答案 1 :(得分:1)
写一个子程序。
set( \%hash, $key1, $val1 );
set( \&hash, $key2, $val2 );
sub set {
my $hash = shift;
my $key = shift;
my $val = shift;
$hash->{$key} = $val if defined $val;
}