【问题标题】:Using any to check existence of element in array inside hash使用 any 来检查哈希内数组中元素的存在
【发布时间】:2016-12-14 15:04:23
【问题描述】:

我正在尝试使用any 检查哈希的元素(数组)是否包含特定项目。因为我的数组可能会变得非常大,所以any 似乎是最有效的方法,因为一旦找到该项目,它就会返回 true。问题是 CLI 返回:

参数 1 到 List::Util::any 的类型必须是块或子 {}(不是数组 取消引用)在...

该行(更改为虚构示例)转载如下。在下面的虚构示例中,我试图查看item2id 是否在item1field 内。

unless(any(@{$hash{$item1}{field}}) eq $hash{$item2}{id}) {
  # Do magic.
}

我做错了什么?由于anyList::Util 的一部分,因此我已在顶部加载了该模块。

use List::Util qw(any);

【问题讨论】:

  • 多大才算非常大? any 比 grep 慢得多。你真的计算过 grep 需要多长时间吗?
  • @ysth 金额可以跑到几十万。
  • @AdamMillerchip:你为什么删除你的答案?我觉得很好。
  • @BramVanroy 以及您希望找到所需元素的时间百分比是多少?
  • @ysth 这很难说,因为我正在处理语言数据。我假设您正在了解以下内容,如果我不希望经常找到结果,那么 grep 会更快,因为必须以任何方式查看整个数组?

标签: arrays perl hash


【解决方案1】:

需要导入函数:

use List::Util qw(any);

更新:如前所述,any 的第一个参数应该是一个代码块。在这种情况下,将哈希值与 $_ 进行比较,$_ 将分配给数组中的每个值,直到条件为真。

unless(any { $_ eq $hash{$item2}{id} } @{$hash{$item1}{field}}) {

【讨论】:

  • @BramVanroy:any { $hash{$item2}{id} } @{$hash{$item1}{field}}) 不会工作。如果$hash{$item2}{id} 的值为true,则它只返回一个true 值,即它存在且已定义且不是0"0" 或空字符串.您必须设置 $_ 以使块的结果取决于您正在测试的值列表,否则您的代码将一遍又一遍地测试相同的、不相关的值 $hash{$item2}{id}
猜你喜欢
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多