仅在定义值时才创建Perl哈希键/值对

时间:2013-05-31 04:36:00

标签: perl

我希望只有在我有一个要分配的定义值时才在哈希中创建一个键/值对。

我目前正在这样做:

$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');

2 个答案:

答案 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;
}