我正在寻找一种更好的方法来首先“测试”哈希键是否存在,然后再使用它。我目前正在编写一个事件日志解析器,将十六进制数字解码为字符串。因为我不能确定我的解码表包含十六进制数字,所以在将值分配给新变量之前,我首先需要检查 key 是否存在于散列中。所以我经常做的是:

if ($MEL[$i]{type} eq '5024') {
  $MEL[$i]{decoded_inline} = $decode_hash{checkpoint}{"$MEL[$i]{raw}[128]"}
    if exists ($decode_hash{checkpoint}{"$MEL[$i]{raw}[128]"})
}

我不喜欢的是表达式 $decode_hash{checkpoint}{"$MEL[$i]{raw}[128]"} 在我的代码中出现了两次。上面的行有更好或更短的版本吗?

最佳答案

是的,有一个更简单的方法。您知道只能将引用存储在数组或散列中,对吗?嗯,这有一个很好的副作用。您可以引用深度散列或数组槽,然后将它们视为标量引用。不幸的副作用是它自动激活了插槽,但是如果您总是要分配给该插槽,并且只想先进行一些检查,那么避免一遍又一遍地输入内容并不是一个坏方法 - 作为以及重复索引结构。

my $ref = \$decode_hash{checkpoint}{"$MEL[$i]{raw}[128]"};
unless ( defined( $$ref )) {
    ...
    $$ref = {};
    ...
}

关于perl - 在分配之前测试哈希条目是否存在的更好方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13430273/

10-13 02:58