2016-09-02 50 views
0

例如,給出(1,2,5,6,7),我想確定3和4是否丟失?在Perl中查找列表中缺失的數字

我發現了以下代碼實現了我的目標。

#!/usr/bin/perl 
use Data::Dumper; 
@list= (1,2,5,6,7); 
@missing = map $list[$_-1]+1..$list[$_]-1, [email protected]; 
print Dumper(\@missing); 

輸出:

$VAR1 = [ 
      3, 
      4 
     ]; 

能有人請解釋背後上面的代碼邏輯?

+2

不知道你在哪裏得到了代碼,但我與它一個輕微的狡辯。 '@ list-1'最好寫成'$#list'。標量上下文中的'@ list'爲您提供'@ list'中元素的數量,並從中減去一個,從而爲您提供數組中的最後一個索引。但'$#list'是一個特殊的變量,它可以在不需要減法的情況下給出'@ list'中的最後一個索引。它更高效,它更好地表達了你的意圖。 –

+1

哦。其實我有另一個代碼問題。 '@ list'是數組變量的糟糕名字。它促進了不正確的(但令人沮喪的普遍)的想法,即Perl中的數組和列表是相同的。 –

+0

@DaveCross感謝您的信息。我從這裏獲取了代碼:http://www.perlmonks.org/?node_id=388315 –

回答

4

地圖EXPRLIST

將評估(每個元素局部地設置$ _)LIST 的每個元素的BLOCK或EXPR並返回每個的結果構成的列表值 這樣的評估。

在你的情況:

map $list[$_-1]+1..$list[$_]-1, [email protected]; 

LIST:[email protected]是含有1至4個元素(數組長度-1)

EXPR列表:$list[$_-1]+1..$list[$_]-1用途從上面的索引(1到4)和用範圍運算符評估表達式。下面

在每次迭代中發生的情況:

$list[1-1]+1..$list[1]-1: 1+1..2-1 = '' 
$list[2-1]+1..$list[2]-1: 2+1..5-1 = 34 
$list[3-1]+1..$list[3]-1: 5+1..6-1 = '' 
$list[4-1]+1..$list[4]-1: 6+1..7-1 = ''