my @array = ( 1, "hoge", 3 );
print "@array\n"; # 1 hoge 3
- 配列を使うことで, 数値や文字列をまとめて格納できます
=
演算子を使うことで, 左辺の配列に右辺の値を代入することができます
- 配列は変数名の前に
@
をつけます
@
はアレイ(array)
のa
, と覚えるとよいでしょう
- 1行目の右側,
( ... )
の部分をリストと呼びます
my @array = ( 1, "hoge", 3 );
print "$array[0]\n"; # 1
print "$array[1]\n"; # hoge
print "$array[2]\n"; # 3
- 配列の一つ一つの要素にアクセスする場合は
$変数名[添字]
を使います
- 添字は1ではなく0からスタートして, 1ずつ増えます
my @array = ( 1, "hoge", 3 );
print "$array[0]\n"; # 1
@変数名[添字]
ではない理由は, 「配列に格納された1つの要素」はスカラ(単一)のデータである為です
my @array = ( 1, "hoge", 3 );
my $sum = $array[0] + $array[2];
print "$sum\n" # => 4
- 配列の要素は普通のスカラ変数と同じように扱えるので, 代入や計算ができます
my @array = ( 1, "hoge", 3 );
print scalar @array; => 3
print $#array; => 2
- 配列を
scalar
演算子に与えると, 配列に格納されている要素の個数を取得できます
@array
に対して$#array
と書くことで, 配列に格納されている最後の要素の添字を取得できます
my @array1 = ( 1, 2 );
my @array2 = ( 1 .. 5 );
my @array3 = ( @array1, 3 ); # (1, 2, 3)
()
を使うことで, 配列にをまとめて代入することができます
- 連続する数字であれば, 範囲演算子
..
を使って1 .. 5
と書くことで1以上5以下
の値を配列に代入できます
- 3行目のように, 数値や文字列だけでなく, 配列も組み合わせることができます
my @array1 = ( 5, 4, 3, 2, 1 );
my @array2 = reverse ( 1 .. 5 ); # OK
my @array3 = ( 5 .. 1 ); # NG
@array1
のように, 連番を逆の順番で配列に格納したい場合はreverse
を使いましょう
- 範囲演算子
..
は, 必ず右側の値が左側の値より大きくなければなりません
- そのため,
@array2 = ( 5 .. 1 );
のように書くと@array2
には空の要素が格納されるので注意しましょう
my @array1 = ( 5, 4, 3, 2, 1 );
my @sorted = sort @array1; # (1, 2, 3, 4, 5)
sort
を使うと, 配列の要素を並び替えます
sort { $a <=> $b }
と書くと, 数値としてソートします
sort { $a cmp $b }
, あるいはsort
のみを書くと, 文字列としてソートします
- 変数
$a
と$b
はsortで使う為に予約されているので, sort以外で使ってはいけません
my @array = ( 1, "hoge", 3 );
for my $var ( @array ) {
print "$var\n";
}
- 配列の中身を走査するのに,
for
文があります
foreach
と書いても問題ありません. 実はPerlの内部では, 同じように処理されます
- この場合, 変数
$var
に$array[0]
, $array[1]
... という値が順番に代入され, 処理が行われます
my @array = ( 1, "hoge", 3 );
for ( my $i = 0; $i < scalar @array; $i++ ) {
print "$array[$i]\n";
}
$#array
は, @array
の最大の添字を表します
-この場合, @array
には3個の要素が格納されているので, $#array
は2となります
- よほどの事がないかぎり, この方式の
for
は使いません!
my @array = ( 1, "hoge", 3 );
for my $i (0 .. scalar @array - 1) {
print "$array[$i]\n";
}
- 先ほどのC言語風のforループは, 範囲演算子を利用してこのように記述することができます.
- 配列
@array
に<STDIN>
を使って3つの文字列を格納し, これを「文字列として」ソートしたものを出力するsort.pl
を書いてみよう
- オプション:
@array
に文字列を3個入力する処理は, <STDIN>
を3回書くのではなく, for文を使ってシンプルに書いてみよう