1

私はPerlで参照がどのように機能するかを理解しようとしており、このサンプルコードを機能させようとしています:

my @name = ("Jack S", "John L", "Cary S");
my @number = ("29", "78", "54");
my @bigNumber = ("40000", "50000", "60000");

my @array2D = (\@name, \@number, \@bigNumber);

この 2 次元配列から印刷しようとしているので、配列の各行に対して次のような出力が得られます。

ジャック S 29 40000

参照部分に頭を巻き付けることができないようです。

4

2 に答える 2

6

Perl で深い構造がどのように見えるかを理解するのに役立つ良い方法は、Data::Dumperを使用することです。例えば:

use strict;
use warnings;

use Data::Dumper;

my @name = ("Jack S", "John L", "Cary S");
my @number = ("29", "78", "54");
my @bigNumber = ("40000", "50000", "60000");

my @array2D = (\@name, \@number, \@bigNumber);

print Dumper \@array2D;

次の出力が表示されます。

$VAR1 = [
          [
            'Jack S',
            'John L',
            'Cary S'
          ],
          [
            '29',
            '78',
            '54'
          ],
          [
            '40000',
            '50000',
            '60000'
          ]
        ];

Dumperつまり、それぞれが配列参照である 3 つの項目を含む配列への参照を渡しました。

したがって、これらの配列をループして、それぞれの最初のスロットに項目を出力したい場合は、次のようにします。

foreach my $ref( @array2D ) { 
    print $ref->[0], " ";
}
print "\n";

そして、それは次のように出力されます:

Jack S 29 40000

それを一般化してすべてのレコードを印刷したい場合は、次のようにすることができます。(これは、ネストされたすべての配列が最初の配列と同じサイズであることを前提としています。)

my $count = @{ $array2D[0] };
foreach my $index( 0 .. $count - 1) { 
    foreach my $ref( @array2D ) { 
        print $ref->[$index], " ";
    }
    print "\n";
}

出力:

Jack S 29 40000
John L 78 50000
Cary S 54 60000

ただし、この時点で、構造を再考することをお勧めします。たとえば、名前でインデックス付けされた配列のハッシュが必要な場合があります。

于 2013-11-09T18:49:45.390 に答える
2

配列要素はスカラー値です。となることによって

$array[0]

いつも単品です。あなたの場合、の各要素に@array2Dは参照が含まれています。これはスカラー値です。メモリ内のアドレス。

$array2D[0]   # this is \@name, printed it looks like ARRAY(0x328c48)

配列参照の値にアクセスするには、2 つの方法があります。

my $aref = [ 'foo', 'bar', 'baz' ];  # [ .. ] creates an anonymous array ref
print $$aref[0];                     # prints "foo"
print $aref->[0];                    # same thing

配列内の配列参照にアクセスするときは、少し複雑ではありますが、同じロジックに従います。

$array[0]           # this is an array ref, like $aref above
$array[0]->[0]      # using the arrow notation we can access the first element
$array[0][0]        # arrows between [], {} are optional, so we can remove it

配列全体にアクセスしたい場合は、次のように参照に配列記号を適用します。

my @foo = @$aref    # @foo is now contains a copy of the elements 

しかし、多次元配列がある場合、単に行うことはできません

@$array[0]          # wrong!

添え字[0]は印章よりも優先順位が低いためです。したがって、サポート中括弧を使用する必要があります

my @foo = @{ $array[0] }

@を使用して配列に$アクセスし、スカラー値にアクセスすることに注意してください。

于 2013-11-09T19:10:52.767 に答える