[ トップ | 一覧 | 更新履歴 ]

PerlArray

PerlVariable | PerlCGI

Perlの配列

ここで書くことって、あまりない。 配列の参照と多次元配列くらいには触れてみます。

perlの変数の配列なので、各要素が同じ型(文字列、スカラ値、参照など)である必要はないです。

1要素とスライス

    my @arr = ('aaa', 'bbb','ccc');
    my $val;
    $val = @arr[0]; # スライス(*1)
    $val = $arr[0]; # 1要素

@がついた変数は配列。通常、@arr[0..2]という使い方は配列のスライスと呼ばれる 使い方。$がついた変数は1要素。@arrの1要素をアクセスするには$arr[n]が正しい。

(*1)はコーディングミスの場合がほとんど。

配列の参照

    my  @arr = ('aaa', 'bbb', 'ccc');
    my  $rarr = @arr;

$rarrには、@arrの最大の添え字-1が返ります。厳密ではないので

    my  $rarr = scalar(@arr);

と解釈されると考えてください。

参照を$rarrに設定したいのであれば、

    my  $rarr = \@arr;

バックスラッシュ'\'を変数の前に付けて下さい。変数の参照は\を付ける事で参照できます。

無名配列

無名配列の参照を変数に入れることもできます。

    my  $rarr = ['aaa', 'bbb', 'ccc'];

上の例文と異なる点は@arrが登場しない、つまり、arrって名前を使用しなくてもすむ場合は こちらの方を使います。

配列をsubroutineに渡す (参照渡しと値渡し)

配列を各要素のリストで値渡しする場合と、配列の参照を渡す場合とがありあます。 (厳密にいえば、perlには参照渡しはない。参照を値渡ししている。Cのpointerと同じです)

    # 呼び出し側
    my  @arr1 = ('aaa', 'bbb', 'ccc');
    sub1(@arr1);
    sub2(\@arr2);
    
    sub sub1
    {
        my  @arr = @_;
        $arr[0] = 'XXX';
    }
    
    sub sub2
    {
       my  ($rarr) = @_;    #引数は1個なのでshiftで受けても$_[0]で受けてもいいです
       $rarr->[0] = 'XXX';
    }

呼び出し側、(@arr1);では、@arr1がリストとして展開され、各要素が@arr1と異なる インスタンスをもってリストがコピーされます。

    ('aaa','bbb','ccc');    # (*a)

と同じで、sub1の関数内で$arr[0]に'XXX'を代入していますが、sub1から戻った時には @arr1の先頭要素$arr1[0]は変更されません。(*a)で新しくリスト要素ができてしまったからです。関数内ではその要素が変更されますが、@arr1のコピーなので@arr1本体は変更されません。

参照を渡しているsub2で参照を実体化して代入すれば@arr2の先頭要素は変更されます。

コーディングの際、引数に参照を渡すか、リストで渡すかは、状況に応じます。 配列が大きくなると、リストをコピーする領域が大きくなり、効率が落ちます。

多次元配列

perl5になっても多次元配列はありません。参照を表現できるようになったので、多次元配列 のようなアクセスはできるようになりました。

   my   @arr = (
                  ['a0','b0'],
                  ['a1','b1'],
                  ['a2','b2']
               );

@arrは無名配列['a0','b0']の参照が第1要素、以降、第3要素までの参照の配列となります。

'a0'を参照するには、

   $arr[0]->[0];

'b0'を参照するには、

   $arr[0]->[1];

'b2'は、

   $arr[2]->[1];

です。

配列と配列、配列とハッシュの間の参照->は省略できます。

   $arr[0]->[1];

は、

   $arr[0][1];

と同じ表現です。多次元配列みたいでしょう?

たとえば

   $robj->[0]->{keyname}->[12]

も、

   $robj->[0]{keyname}[12]

と書くことが出来ます。(最初の"->"が省略できない理由は、考えればすぐわかると思います)

ただ、多次元配列と違うのは、

  my   @arr = (
                  ['a0','b0'],
                  {0=>'a1',1=>'b1'},
                  'aaaaaa',
                  ['a3','b3']
               );

@arrの要素は変数なので、なんでも入れられる。なので、

   $arr[0][0];
   $arr[0][1];
   $arr[1][0];   #(*b)これはどんなエラーが出るでしょうか?
   $arr[2][0];   #(*b)これも?
   $arr[3][0];

(*b)が許されない多次元配列は多次元配列と呼べる? 許されないかどうかまだ試していないけど。

perl5に多次元配列はないが、参照を扱えるようになったため多次元配列風には表現できる、 ということです。


PerlCGI


GzuGzu (WikiWikiWeb descendant) ver 1.00 pre2
このページはGzuGzuで作成されました.
yaino.com