1

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

我目前正在这样做:

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

2 回答 2

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;
于 2013-05-31T04:47:51.280 回答
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;
}
于 2013-06-02T05:41:12.747 回答