2017-03-05 4 views
0

次の配列@ test1と@ test2の作成に違いがあるのはなぜですか? test1のためPerl 2d配列のプッシュ

#!/bin/perl -w 
use Data::Dumper; 
use warnings; 
use strict; 

my @test1 = [ 
    ['note', 1], 
    ['note', 3] 
]; 

print Dumper(@test1); 

my @test2; 
push(@test2, ['note', 1]); 
push(@test2, ['note', 3]); 

print Dumper(@test2); 

Datadump:TEST2ため

$VAR1 = [ 
     [ 
     'note', 
     1 
     ], 
     [ 
     'note', 
     3 
     ] 
    ]; 

Dumpt:

$VAR1 = [ 
      'note', 
      1 
     ]; 
$VAR2 = [ 
      'note', 
      3 
     ]; 

は、反復が@ TEST2に押しながら、@ test1というのと同じ結果を生成する可能性はありますか?

+0

プッシュ(@ {$ test2 [0]}、['note'、1]) 'を試してください。 '@array = [[1]、[2]]'は '@array =([1]、[2]) 'と同じではないことに注意してください。 –

答えて

2

の代わりに:

my @test1 = [ 
    ['note', 1], 
    ['note', 3] 
]; 

あなたはおそらくしたい:

my @test1 = (
    ['note', 1], 
    ['note', 3] 
); 

角括弧は無名配列を作成し、新しい配列への参照を返します。したがって、@test1は、配列への参照である単一のスカラー値を含みます。

print Dumper(\@test2); 

います:とき

$VAR1 = [ 
     [ 
     'note', 
     1 
     ], 
     [ 
     'note', 
     3 
     ] 
    ]; 

が覚えている配列のような構造をダンプするとき

はまた、参照を渡すために、バックスラッシュを前に付けすることはしばしば明確ですPerl関数呼び出しで配列を渡すと、配列は引数リストに "平坦化"されます。

+0

ありがとう!しかし、私はtest1と同じ結果を得るが、プッシュを使用したい! – Matthias

+0

これは珍しいことです。元のサンプルコードでは、@ test1は1つの要素を含む配列ですが、@ test2は2つの要素の配列です。 –