まくまくPerlノート
配列とリストを定義する
2008-02-28

配列とリスト

「配列 (array)」は変数のことで、その中身のデータを「リスト (list)」と呼びます。

my @arr = (100, 200, "aaa");    # 左辺が「配列」で、右辺が「リスト(リストリテラル)」

リストリテラルの定義方法

()                 # 空リスト
(100, 'AAA', 2.5)  # 3 つの要素
(1, 2, 3, )        # 最後のカンマは無視される
($a, $b, $c)       # 変数の値を要素にできる
(1..100)           # 1 から 100 までの値をもつリスト

最後のリストリテラルの定義では、範囲演算子 (range operator) を使っており、左のスカラー値から右のスカラー値まで 1 ずつ増加する整数を要素としたリストが生成されます。整数でない値が指定された場合は、整数値に切り捨てられます。

(1..3)           # (1, 2, 3) と同じ
(1.8..3.2)       # ==> (1..3) ==> (1, 2, 3)
($a..$b)         # $a の値から $b の値まで
(0, 10..12, -1)  # (0, 10, 11, 12, -1)

左の値と右の値が同じ場合は、そのスカラー値だけを持つリストが生成されます。左の値の方が小さい場合は、空リストが生成されます。

(3, 3)   # (3)
(10, 5)  # 空リスト

qw ショートカットを使うと、シングルクォートされたワードのリストを簡単に生成できます。qw は quoted words や quoted by whitespace の略などと言われています。

qw/ AAA BBB 100 200 /    # ('AAA', 'BBB', '100', '200') と同じ

各単語の前後の空白文字や改行が取り除かれたものが、リストの各要素になります。各要素は、シングルクォートで囲まれたものとみなされるので、変数や \n などの特殊文字は使えません。

qw の開始、終了を表すデリミタ文字は、以下のようにいろいろな記号、括弧が使用できます。

qw/ aaa bbb ccc /
qw| aaa bbb ccc |
qw! aaa bbb ccc !
qw# aaa bbb ccc #
qw? aaa bbb ccc ?
qw: aaa bbb ccc :
qw( aaa bbb ccc )
qw{ aaa bbb ccc }
qw[ aaa bbb ccc ]
qw< aaa bbb ccc >

要素内の文字として登場しないデリミタを選択するのが賢い方法です。例えば、パスを表す要素のリストは次のようにスラッシュ以外のデリミタを使うと便利です。スラッシュをデリミタとして使ってしまうと、各スラッシュの前で \ を使ってエスケープする必要があります。

my @dirs = qw{
    /home/andrew
    /home/john
    /home/linda
};

配列の定義

配列を定義するには、@ を付けた配列名にリストを代入します。変数名の先頭に @ を付けると、その変数は配列全体を表します。

my @arr = (100, 'AAA', 200);

以下のように 1 つずつ値を代入しても同じ結果が得られます。この場合は、単一の要素に対するアクセスであることを示すために、先頭の記号は @ でなく $ になります。

$arr[0] = 100;
$arr[1] = 'AAA';
$arr[2] = 200;

リストを配列に代入するときは、要素が 1 つだけの場合、あるいは 1 つの範囲演算子で指定された要素だけの場合は、リストの括弧を省略できます。

my @arr = 5;      # @arr = (5)
my @arr = 1..10;  # @arr = (1..10)

未代入の配列変数の値を参照すると、空リスト () が得られます。

2008-02-28