gpt4 book ai didi

perl - 这是如何工作的 : map used with ternary hook operator and ()

转载 作者:行者123 更新时间:2023-12-04 16:55:56 26 4
gpt4 key购买 nike

在上一个问题中,seaworthy 询问如何从数组中删除前 5 个元素:
How do I remove the first five elements of an array?

在几个建议中,friedo 提出了这个:
my $cnt = 0;
@array = map { ++$cnt < 5 ? ( ) : $_ } @array;

我不明白 ( ) 位。请向我解释这是如何工作的,因为我无法理解它?

我知道三元钩子(Hook)运算符是这样工作的:
(如果有的话)? (然后这样做):(否则这样做)

例如:$a=2; print ($a==2 ? 3 : 4) # 这打印:3
因为我们有: ($a==2 ? 3 : 4)
这意味着:(如果 $a 等于 2)? (然后打印 3):(否则打印 4)

所以用frido的代码,首先$cnt增加到1,然后我们有:
$cnt < 5 ? ( ) : $_意思是:if $cnt is less than 5 ? then ( ) : otherwise $_
我可以看到 $_ 位是如何工作的,因为我有时会像这样使用 map:
@array = map { $_, "\n" } @array
这会从@array 复制一个元素,将副本放入$,然后添加一个\n 换行符,然后将$ 中的值复制回@array(它对@array 中的所有值执行此操作,因此基本上它为每个@array 中的元素)

所以:@array = map { if $cnt is less than 5 then ( ) otherwise $_ } @array
意思是:@array = map { if $cnt is less than 5 then ( ) otherwise copy the element back to @array }
很清楚 ( ) 的意思是“摆脱它”
但我只是不确定它是如何工作的。请问你能解释一下吗?

最佳答案

map ,数组中的每一项都被传递到代码块(在 $_ 中),在那里它可以转换为其他值。换句话说,map转换一个列表。

在这种情况下,我们希望丢弃计数 ($cnt) 小于 5 的值。那么我们如何制作 map当该条件为真时, block 返回“无”?

我们不能说

my $cnt = 0; @array = map { ++$cnt < 5 ? undef : $_ } @array;

因为那样我们最终会得到一个看起来像的数组
( undef, undef, undef, undef, undef, 6, 7, 8 ... )

这不是我们想要的。

但返回 ( )而是返回一个空列表。考虑 push @foo, ( );@bar = ( 1, 2, 3, ( ), 4, 5, 6 );在这些情况下,空的括号集是一个零项列表,对相关数组没有任何影响。

空列表在您需要返回列表项或根本不返回任何内容的三元组中很有用。在表达式上强制列表上下文以获取计数也很有用:
my $count = ( ) = $str =~ /\d/g;

在这里,我们通过将正则表达式分配给一个空列表来将正则表达式放入列表上下文中,从而为我们提供字符串中的位数。然后我们将该空列表分配给 $count .

map 中使用列表的另一个常见示例是当您将某些内容转换为哈希时。例如,
my %unique = map { $_ => 1 } @duplicates;

这里 @duplicates中的每一项转换成一个看起来像 ( 'foo' => 1 ) 的二元素列表虽然它不那么明显,因为没有涉及到括号。然后,所有包含两项的列表被构建成一个由交替的键和值组成的大列表,这些键和值构成了散列。假设您想制作此哈希但排除某些项目。在这种情况下,我们要么需要返回一个键/值,要么什么都不返回。所以这是使用空列表的好机会:
my %filtered_unique = map { some_test( $_ ) ? ( ) : ( $_ => 1 ) } @duplicates;

关于perl - 这是如何工作的 : map used with ternary hook operator and (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134823/

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