Skip to content
This repository has been archived by the owner on May 18, 2022. It is now read-only.

Latest commit

 

History

History
105 lines (80 loc) · 4.45 KB

array-for.md

File metadata and controls

105 lines (80 loc) · 4.45 KB

for文, 配列

配列

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行目のように, 数値や文字列だけでなく, 配列も組み合わせることができます

reverse

my @array1 = ( 5, 4, 3, 2, 1 );
my @array2 = reverse ( 1 .. 5 ); # OK
my @array3 = ( 5 .. 1 ); # NG
  • @array1のように, 連番を逆の順番で配列に格納したい場合はreverseを使いましょう
    • 範囲演算子..は, 必ず右側の値が左側の値より大きくなければなりません
    • そのため, @array2 = ( 5 .. 1 );のように書くと@array2には空の要素が格納されるので注意しましょう

sort

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以外で使ってはいけません

for ループ

my @array = ( 1, "hoge", 3 );
for my $var ( @array ) {
  print "$var\n";
}
  • 配列の中身を走査するのに, for文があります
    • foreachと書いても問題ありません. 実はPerlの内部では, 同じように処理されます
  • この場合, 変数$var$array[0], $array[1] ... という値が順番に代入され, 処理が行われます

for ループ ( C言語風 )

my @array = ( 1, "hoge", 3 );
for ( my $i = 0; $i < scalar @array; $i++ ) {
  print "$array[$i]\n";
}
  • $#arrayは, @arrayの最大の添字を表します -この場合, @arrayには3個の要素が格納されているので, $#arrayは2となります
  • よほどの事がないかぎり, この方式のforは使いません!
    • 先ほど紹介したforループで大抵事足りる為です

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文を使ってシンプルに書いてみよう