Perl:以“perl'ish”方式进行值映射

时间:2017-12-15 13:31:35

标签: perl

我喜欢将内容从一个演示文稿映射到另一个演示文稿,我正在寻找一种“perl'ish”方式来实现它。

示例:

"ok" -> 1 
"nok" -> 0 
else -> -1

我的解决方案很明确,但不是很优雅。如果有超过3个可能的映射(0,1,-1),则会很痛苦。

my $val = "ok";
if ($val eq "ok")
{
    $val = 1;
}
elsif ($val eq "nok")
{
    $val = 0;
}
else
{
    $val = -1;
}

我可以使用哈希,但我仍然需要处理else-part。

$val = "ok";
my %h = ("ok" => 1, "nok" => 0);
if (defined ($h {$val})
{
    $val = $h {$val};
}
else
{
    $val = -1;
}

任何方式都可以在单行中进行,但仍保持可读性?

谢谢!

1 个答案:

答案 0 :(得分:6)

我认为exists可能比defined更安全。

my %translate = (ok => 1, nok => 0);

$val = exists $translate{$val} ? $translate{$val} : -1;

但是如果你可以确定没有任何哈希值是undef,你可以使用“defined-or”运算符:

$val = $translate{$val} // -1;