2016-09-02 28 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 = ''