【发布时间】:2011-07-05 07:46:45
【问题描述】:
在上一个问题中,seaworthy 询问如何从数组中删除前 5 个元素: How do I remove the first five elements of an array?
在几个建议中,friedo 提出了这个:
my $cnt = 0;
@array = map { ++$cnt < 5 ? ( ) : $_ } @array;
我不明白 ( ) 位。请向我解释这是如何工作的,因为我无法理解它?
我知道三元钩子运算符是这样工作的: (如果有的话)? (然后这样做):(否则这样做)
例如:$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 $_
我可以看到 $_ 位是如何工作的,因为我有时会像这样使用地图:
@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 }
很清楚 ( ) 的意思是“摆脱它” 但我只是不确定它是如何工作的。能解释一下吗?
【问题讨论】:
-
我在friedo 的回答中添加了一条评论,他强迫
map表现得像grep。最好只使用grep。my $count = 0; my @new_array = grep {++$count > 5} @array;。因为你的问题是它是如何工作的,所以我没有发布作为答案。只是告诉您这一点,以便您在可以使用更好的技术时不要使用复杂的技术。注:splice可能是最好的,因为它正在使用旨在执行此操作的功能。很多时候,Perl 的作者对这些函数进行了优化,这些函数可能比我们使用其他函数自己构建的函数更快/更好。 -
使用我添加到原始问题的声明
state另请参阅我的答案
标签: perl