gpt4 book ai didi

perl - 理解代码 : Hash, grep 重复(修改为检查多个元素)

转载 作者:行者123 更新时间:2023-12-03 17:23:27 24 4
gpt4 key购买 nike

代码:

@all_matches = grep
{
! ( $seensentence
{
$_->[0] .'-'. $_->[1] .'-'. $_->[5]
}
++ )
}
@all_matches;

用途:此代码从数组 @all_matches 中删除某些元素的重复项这是一个 AoA。

我尝试全面分解 (与 ??..?? 在我不确定的地方):

Grep 返回 @all_matches 的元素返回true。

散列的键 %seensentence是??三要素??的 @all_matches .由于散列只能具有唯一键,因此第一次通过它的值从 undef(0) 增加到 1。下一次通过时,它是一个定义的值,但 !意味着 grep 仅在它是 undef (与该元素关联的唯一值)时才返回它。

我的问题:

(1) 怎么转 {$_->[0] .'-'. $_->[1] .'-'. $_->[5]}++变成HoH?

有人告诉我这是实现它的另一种(惯用的)方法。在黑暗中刺伤将是:
( {$_->[0] => 0,
$_->[1] => 0,
$_->[5] => 0} )++

(1b) 因为我不明白原作是如何做我想要的。我读到了 -bareword相当于 "-bareword"所以我试过: {"$_->[0]" . "$_->[1]". "$_->[5]"}它似乎完全一样。我仍然不明白:是将每个元素单独视为一个键(a)(就像一个键数组)还是(b) 正确 :同时(因为 . 将它们全部连接成一个字符串)还是 (c) 没有做我认为的事情?

(2) 这是什么意思: $_->[0] || $_->[1] || $_->[5] ?它的作用与上面不同。

我读到:短路逻辑运算符返回最后一个值,因此它会检查 {$_->[0]} 处的值。如果有,我认为那里的值会增加,如果没有,它会检查下一个元素,直到没有一个为真,这是 grep 传递唯一值的时候。

感谢您的时间,我试图尽可能彻底(错误?)但如果有任何遗漏,请告诉我。

最佳答案

首先让我们打开 grepforeach循环,以便我们可以更清楚地检查它。为了清楚起见,我将把一些习语扩展成更大的结构。

my @all_matches = ( ... );
{
my %seen;
my @no_dupes;
foreach my $match ( @all_matches ) {
my $first_item = $match->[0];
my $second_item = $match->[1];
my $third_item = $match->[5];
my $key = join '-', $first_item, $second_item, $third_item;
if( not $seen{ $key }++ ) {
push @no_dupes, $match;
}
}
@all_matches = @no_dupes;
}

换句话说,原始编码器正在使用 $match 中保存的数组引用为 $match->[0] 的每个引用索引创建一个散列键。 , 1 , 和 5 .由于散列键是唯一的,在插入 @no_dupes 之前,通过检查键是否已经存在,将删除任何重复项。 .
grep{}机制只是一种更高效的代码(即,更快地键入,并且没有一次性变量)来完成同样的事情。如果它有效,为什么要重构它?什么是你不需要改进的?

要对 HoH 执行相同操作,您可以执行以下操作:
my @all_matches = ( ... );
{
my %seen;
my @no_dupes;
foreach my $match ( @all_matches ) {
my $first_item = $match->[0];
my $second_item = $match->[1];
my $third_item = $match->[5];
if( not $seen{ $first_item }->{ $second_item }->{ $third_item }++ ) {
push @no_dupes, $match;
}
}
@all_matches = @no_dupes;
}

可以将其翻译回 grep 如下:
my @all_matches = ( ... );
{
my %seen;
@all_matches = grep { not $seen{$_->[0]}->{$_->[1]}{$_->[5]}++ } @all_matches;
}

但是,在这种情况下,我看不到构建数据结构的明显优势,除非您打算使用 %seen后来为了别的东西。

关于 ||接线员,那是另一种动物。在这种情况下,我想不出任何有用的方法来使用它。例如,“ $a || $b || $c”的逻辑短路运算符测试 $a 的 bool 真实性。 .如果为真,则返回其值。如果为假,则检查 $b以同样的方式。如果为假,则检查 $c以同样的方式。但如果 $a是真的, $b永远不会被检查。如 $b是真的, $c永远不会被检查。

关于perl - 理解代码 : Hash, grep 重复(修改为检查多个元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6636645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com