ためになるホームページ お問い合わせ




TOP > Perl > リストと配列
リストと配列
リストは、スカラー変数の集合に順序をつけて並べたもの。配列は、リストを保持する変数。
配列やリストは、0からふった番号(インデックス)でアクセスする事ができる。

配列にアクセス
配列にアクセスするには、要素を指定する。また未使用の配列要素はundefである。

配列にアクセスの例
$array[0] = "abc";
$array[1] = "def";
if (!defined($array[1000])
{
  print "undefです。\n";
}


配列の特別な使い方
配列に代入する際、インデックスをあけて代入した場合、代入していない要素の値は全てundefになる。

配列の特別な使い方の例1
$array[0] = 1;
$array[1] = 2;
$array[99] = 100;
#この時、$array[2]〜$array[98]はundefとなる



また、負の数でアクセスする事ができる。[-1]だと最後の要素の値にアクセスでき、-2、-3と末尾から順にアクセスできる。但し、扱える負の値は-3までである。

配列の特別な使い方の例2
$array[0] = 1;
$array[1] = 2;
$array[2] = 3;
$array[3] = 4;
$array[4] = 5;
print "$array[-1]\n"; #5が表示
print "$array[-2]\n"; #4が表示
print "$array[-3]\n"; #3が表示


配列の要素数を知る
配列の最後のインデックスを知るには、$#配列名である(シェルから?)。但し、この値は最後の要素番号なので、実際の要素の数は[0]を足した数となる。

配列の要素数を知る
$array[0] = 1;
$array[1] = 2;
$array[2] = 3;
print "$#array\n";           #2が出力
print "$array[$#array]\n";   #3が出力
print "$array[-1]\n";        #3が出力


リストリテラル
プログラム中でリスト値を記述するための表記法で値をコンマで区切って、括弧で囲んだもの。

リストリテラルの例
(1, 2, 3)
(1, 2, 3,)  #最後のカンマは無視
()          #空リスト


範囲演算子(..)
左のスカラー値から、右のスカラー血までの範囲で1つずつ増加する値のリストを生成する。少数点は、切り捨てられリスト化される。

範囲演算子の例
(1 .. 5)     #(1, 2, 3, 4, 5)
(1.7 .. 5.7) #(1, 2, 3, 4, 5)
(5 .. 1)     #空リスト 範囲演算子は増加のみ
(0, 1..4, 5) #(0, 1, 2, 3, 4, 5)


qwショートカット
余分なクォート記号をいちいち書かずに、リストを記述できる。
(書式)qw デリミタ リスト... デリミタ
qwショートカットのリストは、シングルクォートで囲まれた文字列として扱う。リスト値は空白文字を捨てて、残ったものがリスト値とされる。また、デリミタは任意の記号が使える。

qwショートカットの例
qw! abc def ghi !
qw{ abc def ghi }
qw# abc def ght #
qw/ abc def ghi /
qw! abc\! def\! ghi\! ! #バックスラッシュで終了にしない


リスト代入
リスト代入を行う際、代入する値(右辺)の方が多かった場合は、無駄な値は捨てられる。逆に左辺の方が多かった場合は、代入できないリスト値はundefとなる。

リスト代入の例
($array[0], $array[1]) = ("abc", "def");
($array[0], $array[1]) = ("abc", "def", "ghi");  #"ghi"は捨てられる
($array[0], $array[1]) = ("abc");                #array[1]はundef


配列の宣言
配列を宣言する際、@をつけて使うことができる。

配列の宣言の例
@array = qw / abc def ght /;  #qwショートカット
@array = ();                  #空リスト
@array = 1..10;               #範囲演算子
@array = (1..4, undef, 6..9); #undefで明示する。$array[4]はundef
@array = (1..4, @tmp, 6..9);  #配列を使う事もできる


pop演算子とpush演算子
pop演算子は配列から最後の要素を取り出して、その値を返す。注意しなければいけないのは、取り出した際に配列の要素数は1個減る。
push演算子は配列の末尾に値を追加する。

pop演算子とpush演算子の例
@array = 0..4;
$val = pop(@array);       #$valは4、@arrayは(0, 1, 2, 3)
$val = pop @array;        #$valは3、@arrayは(0, 1, 2) 括弧はなくても可
pop @array;               #無効コンテキスト。返した値をどこにも格納しない。@arrayは(0, 1)
push (@array, 3);         #@arrayは(0, 1, 2, 3);
push @array, 4;           #@arrayは(0, 1, 2, 3, 4);
push @array, 5..9;        #@arrayは(0..9);


shift演算子とunshift演算子
shift演算子は配列の先頭の値を取り出し、unshift演算子は配列の先頭に値を追加する。

shift演算子とunshift演算子の例
@array = qw / 0..3 /;
$val = shift (@array);    #$valは0, @arrayは(1, 2, 3)
$val = shift @array;      #$valは1, @arrayは(2, 3)
shift @array;             #@arrayは(3)
unshift (@array, 2);      #@arrayは(2,3)
unshift @array, 1;        #@arrayは(1, 2,3)


配列の展開
配列の要素を指定しないで、ダブルクォートで囲むとスペースをはさんで全ての要素の値が展開される。要素を指定すれば、その要素の値を展開する事ができる。

配列の展開の例
@array = qw / abc def ghi /;
$array = "array";
print "@array";               #全ての展開
print "\@array";              #@arrayと表示
print "$array[0]\n";          #abcと表示
print "${array}[0]\n";        #array[0]と表示
print "$array" . "[0]\n";     #array[0]と表示
print "$array\[0]\n";         #array[0]と表示


foreach
値のリストを受け取り、それぞれの値に対して1回ずつブロックを実行する。

foreachの例
foreach $tmp (qw / abc def ghi / )
{
  print "$tmp\n";
}

制御変数の値はループを抜けた時点で、元の値に戻る(初期化していなければ、undef)

$_変数
foreachで制御変数を省略するとデフォルトで、「$_」に格納される。

$_変数を使う例
@array = qw / abc def ghi /;
foreach (@array)
{
  print "$_";
  #尚、printで出力する際、$_も省略する事ができる。
  #print ;
}


sort演算子
値のリスト(配列)を受け取り、文字順に並び替える(ASCII)

sort演算子の例
@array = qw / def ghi abc /;
@s_arrray = sort @array;
@s_array = sort(@array);

reverse演算子もsort演算子も受け取るリスト(配列)の値は、不変である。返した値に対してのみreverse,sortが働く。





Copyright 2007 ためになるホームページ All Rights Reserved.