我喜欢将内容从一个演示文稿映射到另一个演示文稿,我正在寻找一种“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;
}
任何方式都可以在单行中进行,但仍保持可读性?
谢谢!
答案 0 :(得分:6)
我认为exists
可能比defined
更安全。
my %translate = (ok => 1, nok => 0);
$val = exists $translate{$val} ? $translate{$val} : -1;
但是如果你可以确定没有任何哈希值是undef
,你可以使用“defined-or”运算符:
$val = $translate{$val} // -1;