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

标签 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;
}

我可以使用散列,但我仍然需要处理其他部分。

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

有什么方法可以在一行中完成它但仍然保持可读性??

谢谢!

最佳答案

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

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

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

但是,如果您可以确定所有哈希值都不会是 undef,则可以使用“定义或”运算符:

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

关于Perl:以 "perl' ish"方式进行值映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47833420/

相关文章:

perl - 转储 XML::LibXML 元素

regex - Perl中正则表达式中的&号有什么用

mysql - DBIx::新建和创建类错误

perl - 如何在没有 apache 的情况下运行我的 perl CGI 脚本?

perl - 我可以在堆栈中上下移动调试器上下文吗?

perl - 如何判断 Perl 模块是核心还是标准安装的一部分?

mysql - 使用 Perl,如何从单个表加载多个表,同时保持引用完整性?

windows - 使用 Win32::ChangeNotify 并等待操作完成

python - 删除匹配项倒数第二个和倒数第二个之间的所有内容

regex - Perl Slurp 正则表达式捕获