2011-06-29 8 views
5

マップを使用して2D配列の最初の要素を抽出しています。ここに小さなコードスニペットがあります。このマップの動作を理解します

my $array = [ [1,11,111], [2,22], undef, [4] ]; 

my @firstList = map { (defined $_) && $_->[0] } @$array; 

ここで、値がundefまたは$ arrayの要素の最初の要素の要素を持つ配列を返すようにマップが期待しています。

しかし、出力は私が期待しているものと同じではありません。 undefについては、 'スカラー'型の要素を取得しています。

マップ・ステートメントを次のブロックで変更すると、予期した結果が得られます。

my @firstList = map { $_->[0] } @$array; 

これらの2つのマップステートメントについて理解してください。

答えて

4

最後に実行した操作の結果を返します。

最初は、undefの場合は(defined $_) && $_->[0]と評価され、defined $_がfalseであると判断し、ブール式の処理を停止します。 $_->[0]はこの場合はまったく評価されません。 defined $_が評価された最後の操作であり、結果はfalseであり、これは0で表されていると推測しています。

2番目の値は、@$arrayという子の実際の値で、undefという値が得られます。

+0

小さな修正: 'defined undef'は' '' 'を返します。 – Dallaylaen

+2

私はなぜundef - > [0]が(厳密に 'strict'の下で)うまくいくのだろうと思っていました。それが[autovivified](http://en.wikipedia.org/wiki/Autovivification)であることがわかります。つまり、暗黙のうちに元の配列の '[]' **に設定されています**。 – Dallaylaen

+1

@Dallaylaen:これは、CPANがhttp://search.cpan.org/perldoc?autovivificationに "autovivification"モジュールを持っていて、 'no autovivification; –

0
map { (defined $_) && $_->[0] } 

実際には、配列内のすべての要素を反復処理し、関数または式を適用します。外字の場合、次の関数:defined($_) && $_->[0] あなたのセルがundefの場合、配列の3番目のセルはdefined(undef) && $->[0](これは''と同じです)と評価され、他方は1 && $->[0]と評価され、$ - > [0 ]。

ところで、2番目のステートメントが動作する理由も、配列の各セルについて、最初の内側のセルを選択することになります。

関連する問題