Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl grep如何确定几个哈希的并集?_Perl_Grep - Fatal编程技术网

Perl grep如何确定几个哈希的并集?

Perl grep如何确定几个哈希的并集?,perl,grep,Perl,Grep,我不明白这个函数的最后一行 下面是如何编写一个函数,通过返回传递给它的所有散列中出现的键列表来执行某种集合交集: @common=inter(\%foo,\%bar,\%joe); 亚国际{ 我看到的百分比; 对于我的$href(@){ while(my$k=each%$href){ $seen{$k}++; } } 返回grep{$seen{${}=@}键%seen; } 我知道%seen是一个散列,它将每个键映射到它在提供给函数的任何散列中遇到的次数。将获取传递给它的列表(在这种情况下,任

我不明白这个函数的最后一行

下面是如何编写一个函数,通过返回传递给它的所有散列中出现的键列表来执行某种集合交集:

@common=inter(\%foo,\%bar,\%joe);
亚国际{
我看到的百分比;
对于我的$href(@){
while(my$k=each%$href){
$seen{$k}++;
}
}
返回grep{$seen{${}=@}键%seen;
}
我知道
%seen
是一个散列,它将每个键映射到它在提供给函数的任何散列中遇到的次数。

将获取传递给它的列表(在这种情况下,任何散列引用中看到的每个元素);并仅返回块中表达式为真的那些元素的列表(对列表中的每个元素局部设置
$\uu
变量)

让我们看看该表达式是如何计算的:

  • @
    是传递给子例程的所有参数的数组-在本例中是传递的哈希引用列表

  • $seen{$\u}=@
    表达式中,该列表被强制放入一个表达式中(由于
    =

  • 在标量上下文中使用时,列表的计算结果为列表中的元素数-在上面的示例调用中,为3,因为传入了3个hashref

因此,对于在
%中看到的每个键(例如,在N个hashref中看到的每个键);表达式
$seen{$\u}=@
在数值上比较了元素在散列中出现的次数与散列总数-当然,只有当元素在所有传入的散列中,因此是我们想要的交叉点的成员时,它才会相等


因此,为了总结分析,grep将返回每个散列中出现的所有键的列表(即出现N次,其中N是散列的#)。例如交叉点。

函数的目的是查找传递给它的所有哈希中出现的元素

最后一行
grep
s从查看的
keys%返回的列表。要确定给定键是否出现在传递给函数的所有哈希中,我们可以将
%seen
中该键的值与
inter
的参数数进行比较

grep
块中,
$\uu
被设置为
键列表的每个元素,并测试某些条件

标量上下文中的数组计算为其长度
@
是传递到子例程的参数数组。而
=
运算符将其操作数放在标量上下文中,因此我们可以将
$seen{$}
的值与长度
@
进行比较。如果它们是相同的,那么该键出现在所有哈希中

grep block list 
这将依次将块应用于列表的每个元素,该元素的别名为$。如果块返回true,则将元素添加到返回的数组中

在这种情况下:

grep { $seen{$_} == @_ } keys %seen
块是
$seen{$\u}=@
,它将seen散列的值与
@
进行比较
@
在标量上下文中计算,因此返回
@
数组中的元素数
@
表示当前函数的参数。在本例中,
(\%foo,\%bar,\%joe)
,它在标量上下文中返回
3
。我们的列表是
keys%seen
,它是一个数组,包含
%seen
中存在的所有键

同等英语声明:

  • “给我一张所有钥匙的清单
    %已看到
    其中与 该键等于 传递给此函数的元素“
  • “给我一张所有钥匙的清单
    %已看到
    其中与 那把钥匙是
    3
  • “给我一张清单 已看到
    %中的所有键
    值
    3
    ,即看到
    %中的所有键
    这三种情况中的每一种都存在
    传递给此函数的hashrefs“

非常好。救了我一天。事实上,我写了一段代码片段来理解发生了什么,当时我绞尽脑汁想了将近一个小时,但还是想不出来。
grep { $seen{$_} == @_ } keys %seen