Arrays 使用any检查哈希内数组中元素的存在性

Arrays 使用any检查哈希内数组中元素的存在性,arrays,perl,hash,Arrays,Perl,Hash,我试图使用any检查散列的元素(数组)是否包含特定项。因为我的数组可能会变得非常大,所以any似乎是最有效的方法,因为它会在找到项目后立即返回true。问题在于CLI返回: 要列出的arg 1的类型::Util::any必须是块或子{}(不是数组 取消引用)在 该行(改为虚构的示例)复制如下。我试图查看item2的id是否在下面虚构的示例中item1的字段中 unless(any(@{$hash{$item1}{field}}) eq $hash{$item2}{id}) { # Do ma

我试图使用
any
检查散列的元素(数组)是否包含特定项。因为我的数组可能会变得非常大,所以
any
似乎是最有效的方法,因为它会在找到项目后立即返回true。问题在于CLI返回:

要列出的arg 1的类型::Util::any必须是块或子{}(不是数组 取消引用)在

该行(改为虚构的示例)复制如下。我试图查看
item2
id
是否在下面虚构的示例中
item1
字段中

unless(any(@{$hash{$item1}{field}}) eq $hash{$item2}{id}) {
  # Do magic.
}
我做错了什么?作为
List::Util
的一部分,我在顶部加载了该模块

use List::Util qw(any);

您需要导入函数:

use List::Util qw(any);
更新:如上所述,
any
的第一个参数应该是一个代码块。在本例中,将哈希值与$\进行比较,直到条件为真为止,它被分配给数组中的每个值

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

您需要导入函数:

use List::Util qw(any);
更新:如上所述,
any
的第一个参数应该是一个代码块。在本例中,将哈希值与$\进行比较,直到条件为真为止,它被分配给数组中的每个值

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

多大是非常大的?any比grep慢得多。你真的计算过grep需要多长时间吗?@ysth这个数字可以达到十万。@AdamMillerchip:你为什么要删除你的答案?对我来说这似乎很好。@BramVanroy那么你希望找到你正在寻找的元素的时间百分比是多少?@ysth这很难说,因为我在处理语言数据。我假设您得到了以下结果,如果我不希望经常找到结果,grep将更快,因为必须以任何方式查看整个阵列?多大是非常大?any比grep慢得多。你真的计算过grep需要多长时间吗?@ysth这个数字可以达到十万。@AdamMillerchip:你为什么要删除你的答案?对我来说这似乎很好。@BramVanroy那么你希望找到你正在寻找的元素的时间百分比是多少?@ysth这很难说,因为我在处理语言数据。我假设您得到了以下结果,如果我不希望经常找到结果,grep将更快,因为整个数组都必须通过任何方式进行查看?@BramVanroy:
any{$hash{$item2}{id}}}{$hash{$item1}{field}}
将无法工作。如果
$hash{$item2}{id}
的值为真,则它只返回一个真值,即它存在且已定义,并且不是
0
“0”
或空字符串。您必须将块的结果设置为依赖于您正在测试的值列表,否则您的代码只会反复测试相同的、不相关的值。
$hash{$item2}{id}
。@BramVanroy:
任何{$hash{$item2}{id}}{$hash{$item1}{field}}
都不起作用。如果
$hash{$item2}{id}
的值为真,则它只返回一个真值,即它存在且已定义,并且不是
0
“0”
或空字符串。必须将块的结果设置为取决于正在测试的值列表,否则代码将反复测试相同的、不相关的值
$hash{$item2}{id}