将许多字符串映射到perl中的一个字符串

时间:2011-09-13 14:24:10

标签: perl

我想做点什么

$val = "value1"
my %test = ("value1" => "yes", "value2" => "yes", "value3" => "yes");
print  $test{$val};

因此,如果$ val等于value1,value2或value3,则显示“yes”,否则显示“no”

不确定我是否采用正确/有效的方式。我是perl的新手

4 个答案:

答案 0 :(得分:3)

您必须测试散列中是否存在具有此类键的值:

print exists $tests{$val} ? $tests{$val} : "no";

通常,在检查其存在之后,您必须通过defined检查其定义,但在您的特定情况下,这不是必需的,因为%test哈希似乎是常量并且是组合的仅包含不包含undef的常量。

答案 1 :(得分:2)

if (defined $test{$val}) {
    print "$test{$val}\n";  # or you might use: print "yes\n"; depending on what you're doing
}
else {
    print "no\n";
}

答案 2 :(得分:1)

当只有两个选项时,哈希是最好的数据结构吗?以下是三个可能的替代子程序,它们同样满足要求:

sub test_ternary {
    $_[0] eq 'value1' ? 'yes' :
    $_[0] eq 'value2' ? 'yes' :
    $_[0] eq 'value3' ? 'yes' : 'no'  ;
}

sub test_regex { $_[0] =~ /value[123]/ ? 'yes' : 'no' }

use feature 'switch';
sub test_switch {
    given ( $_[0] ) {

        return 'yes' when /value[123]/;

        default { return 'no'; }
    }
}

答案 3 :(得分:0)

这里有些复杂的答案。

如果散列中的有效值不能为零或空字符串(或perl中任何其他值为“false”的值),则可以执行以下操作:

say $test{$val} ? $test{$val} : "no";

如果$test{$val}不存在,未定义,为空或为零,则此表达式将为“false”。