2016-09-02 16 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

あなたがそのコードを得たが、私はそれで1つのわずかな屁理屈を持っているところわかりません。 '@ list-1'は' $#list'として書かれています。スカラーコンテキストの '@list'は、' @list'の要素の数を返します。その中から1つを減算すると、配列の最後のインデックスが得られます。しかし、 '$#list'は、減算を必要とせずに' @list'の最後のインデックスを与える特別な変数です。それはより効率的で、あなたの意図をよりよく表します。 –

+1

ああ。実際に私はそのコードに別の問題があります。 '@list'は配列変数のひどい名前です。これはPerlの配列とリストが同じものであるという誤った(しかしうつ病のような)考えを助長します。 –

+0

@DaveCross情報をありがとう。私はここからコードを取った:http://www.perlmonks.org/?node_id=388315 –

答えて

4

マップEXPRLIST

は(各要素に対してローカルに$を設定_)LIST の各要素をブロックまたはEXPRを評価し、それぞれの結果からなるリスト値 を返しますそのような評価。あなたのケースで

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

LIST:[email protected]$list[$_-1]+1..$list[$_]-1用途は1から4までの要素(配列の長さ-1)

EXPRを含むリストです上からのインデックス(1〜4)を返し、range演算子で式を評価します。各反復で

は以下起こる:

$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 = '' 
関連する問題