我有一个数组和一个哈希。我想将哈希的键与数组的元素进行匹配。
我找到了一个表达式来grep所有与数组匹配的键。它有效,但我不确定我是否理解它是如何工作的。你能解释grep
之后发生了什么吗?
已定义数组@text
和哈希%sys
。
my @new_array = grep { exists $sys{$_} ? $sys{$_} : 0 } @text;
答案 0 :(得分:2)
您找到的代码过于复杂。它可能/应该是*:
my @new_array = grep { $sys{$_} } @text;
grep
函数将一个列表 - 在本例中是@text
数组的内容 - 处理成一个新列表,该列表仅包含中间表达式求值为真值的元素。默认值$_
依次设置为每个列表项,以便表达式可以考虑列表内容。
示例中的表达式包括一个三元运算符?
,如果第一部分为真,则计算:
之前的项,如果为false,则计算其后的值。因此,在您的情况下,它检查每个键是否在%sys
哈希中,并且如果存在则评估为哈希条目的查找,如果不存在则评估为0(假值)。功能上在grep
内部,这应该与$sys{$_}
相同,因为从查找不存在的键的值中获得的undef
也是假值。
*
但是,有一点需要注意 - 如果%sys
绑定到Perl类并且覆盖了一些散列函数,则会为exists
和散列查找调用不同的散列方法。因此,在这种情况下,性能或行为可能会有所不同。