配列

  1. リスト

    1. リスト

      複数の要素を , で区切り、(..) で囲んだ表現をリストといい、Perlの基本的なデータ構造になります。Perlでは、リストを配列の値として利用することができます。
       (1,2,3)
       ("abc","123")

  2. 配列、要素

    1. 配列と要素

      @名前で配列を定義します。配列はリストを記憶します。
          @name_list=("Aya","Yumi","Tae");
      $name_list[$i] で、配列の $i 番目の要素を表します。

    2. 複数指定

      複数の要素を指定することができます。
       @array[0,5]で配列の要素の0と5番目を指示する。
       @array[0,5]=@array[5,0];で0番目と5番目の要素を交換できる。

    3. 配列の演算

      Perlの配列はリストですから数に制限はありませんが、特定のデータを取り出す操作より、下記のリスト操作の方が効率的です。
       shift(@array)    #配列の先頭を取り出す(リストを左シフト)
       unshift(@array,値) #配列の先頭にデータを追加(リストを右シフト)
       push(@array)     #配列の末尾に追加
       $d=pop(@array)    #配列の末尾を取り出しdに記録

    4. 先頭は 1,2,..,7 までのリストを作成し、配列に記録します。@arrayはC言語の配列のポインタに相当しま。
      @array[2]で3番目の要素を取り出します。printでは、@array 全体の表示も可能です。
      push,popは、配列の最後をスタックの先頭と考えます。配列に順次値を追加する場合、pushで詰め込むのが効率的です。
       shift、unshiftは配列を横にならべ、左右にシフトする操作です。先頭から順に取り出すには、shiftを行うのが簡明です。
      #array
      
      {
       print "array element\n" ;
       @array=(1..7);
        print "@array[2]:"."@array"."\n\n";
      
        print "push,pop\n";
        push(@array,8);
        print "@array\n";
        $d=pop(@array);
        print "$d:"."@array\n\n";
      
       print "shift,unshift\n";
       $d=shift(@array);
       print "$d:"."@array\n";
       unshift(@array,0);
       print "@array\n";
      
      }
      実行結果

      C:\lang\perl\sample>perl array.pl
      array element
      3:1 2 3 4 5 6 7
      
      push,pop
      1 2 3 4 5 6 7 8
      8:1 2 3 4 5 6 7
      
      shift,unshift
      1:2 3 4 5 6 7
      0 2 3 4 5 6 7

    5. 数字名の配列

      Perlはインタプリタ方式であるため、実行時に配列を生成します。また、Perlでは数字の配列名を許していますから、
        $i=3;$$i[4]=2;
      などのスクリプトが可能です。$$i は $i(この場合3) の名前の配列ですから、$3[4]=2; と同じことになります。
    6. 繰り返し処理

      配列の各要素に繰り返し処理を行うには、 foreach 文が便利で、効率が良い方法です。
      @member=("pen","eraser","tape","clip");
      
       foreach $name (@member){
         print "$name\n";
       }
      
       my $i;
       for($i=0; $i < @member; $i++){
         print "@member[$i]\n";
       }
       実行結果
      pen
      eraser
      tape
      clip
      pen
      eraser
      tape
      clip

  3. 連想(ハッシュ)配列

     
    1. 連想配列

      Perlでは値で参照できる連想(ハッシュとも呼ばれます)配列を利用できます。連想配列では %relation のように先頭に%をつけ、$relation{$name} のように、{<値>}で参照します。下の例のように、2組の文字が対になります。最初の$nameの文字列が参照キーとなり、対となる文字列を抜き出します。
       $relation{"Sawada”}は"Yumi"となります。
      値を取り出すとき、名前の先頭は、%でなく、$ になることに注意してください。

    2. %relation=("Itoh","Aya","Sawada","Yumi","Taguchi","Tae");
      print "your name?\n";
      $name=<stdin>;
      chop($name);
      print "name",$relation{$name}\n";

    3. 連想配列の更新

      連想配列に、新しい 対 を記録したり、更新するには、
           $<配列名>{<キー>}=<値>
      とします。配列名の先頭が$であり、キーの指定は { } であることに注意してください。同じキーが登録されている場合、古い値は上書きされます。
       キーとその値を削除するには、
           delete $<配列名>{<キー>}
      とします。キーの存在は、
           exists($<配列名>{'<キー>'})
      で、論理値が返ります。すべてのキーのリストは、
            keys(%<配列名>)
      で、取得できます。また、すべてのm組の値は
           each(%<配列名>)
      で取得できます。

    4. 連想配列の利用例を紹介します。
      #hash table
      
      {
      
        %hash=('ito','mkt','kume','aya');
        print "*extract*\n";
        print "$hash{'kume'}\n";
      
      #insert
        print "\n*insert*\n";
        $hash{'makino'}='teru';
        print "makino:$hash{'makino'}\n";
      
      #update
        print "\n*update*\n";
        $hash{'kume'}='masa';
        print "kume:$hash{'kume'}\n";
      
      #delete 
        print "\n*delete*\n";
        delete $hash{'kume'};
        print "kume:$hash{'kume'}\n";
        print "not exist \n" if (! exists($hash{'kume'}));
      
      #print all keys
        print "\nall keys\n";
        foreach $key (keys(%hash)){
          print " $key:"
        }
      
      #print all pairs
        print "\n\nall items\n";
        print " $key -> $val\n" while (($key,$val)=each(%hash));
      
      }

      実行結果
      *extract*
      aya
      
      *insert*
      makino:teru
      
      *update*
      kume:masa
      
      *delete*
      kume:
      not exist
      
      all keys
      ito: makino:
      
      all items
      ito -> mkt
      makino -> teru