使用在先前的問題地圖,適航詢問如何從數組中刪除該第一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 因爲我們有:($一個== 2 3:4) 這意味着:(如果$ a等於到2)? (然後打印3):(否則打印4)
所以,第一$ 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'。 '我的$ count = 0; my @ new_array = grep {++ $ count> 5} @array;'。既然你的問題是如何工作的,我不會發布作爲答案。只是告訴你這一點,所以當你可以使用更好的技術時,你不會使用複雜的技術。注: 'splice'可能是最好的,因爲它正在使用設計來執行此操作的功能。很多時候,Perl的編寫者對這些函數進行了優化,可能比我們使用其他函數自己構建的函數更快/更好。 – 2011-02-27 19:24:15
另請參閱我的答案使用聲明'狀態',我添加到原始問題 – 2011-02-27 19:53:27