今回やっていくのはこちら! 配列とfor文です! 前回のPerlの基礎として変数を扱いました。 今回はその知識をもっと深めていくので復習にどうぞ!
エンジニア基礎① 1. Perl環境基礎 2. Hello,world! 3. Perl基礎 4. ⭐️配列・for文⭐️ 5. ハッシュ 6. リファレンス 7. サブルーチン 8. 正規表現 9. Amon2 入門 第一部 10. Amon2 入門 第二部
ゴール🏁(めやす:30分)
- 配列がわかる
- for文がわかる
いざ!スタート!
1. 配列
前回、変数の説明で、
- スカラー変数:1個の変数`hoge`に対して、`1`か`hello`か、1つの要素のみ格納できる - 配列 / 連想配列(ハッシュ):1つの変数`hoge`に対して、`1`も`hello`も、どちらも格納できる
としました。今回は複数の要素を格納できる配列について見ていきます。
◼︎基本
my @array = ( 1, "hello", 3 ); print "@array\n";
出力結果↓
1 hoge 3
というように配列の場合は、変数名array
の前に@
(=シジル:変数名の前に書く記号のこと)をつけます。
リスト( hoge, foo, bar );
をprint
で出力すると、()内の順番での表示になります。
◼︎添字
リスト内の要素に1つだけアクセスする場合は、@変数名[添字]
で呼び出します。添字のスタートは0からになります。1番目の要素を呼び出したいときは、添字[0]
になります。
my @array = ( 1,"hoge", 3 ); print "$array[0]\n"; print "$array[1]\n"; print "$array[2]\n";
出力結果↓
1 hoge 3
また1個だけ呼び出して出力するときは、複数の変数を扱う「配列」でなく、1つの変数を扱う「スカラー変数」になるので、変数前につけるのは、@
ではなく、$
になります。
◼︎要素数
格納したデータの中身ではなく、要素数が知りたいときはscalar
演算子を与えると、要素数を取り出せます。$#変数名
では最後の要素の添字を呼び出せます。
my @array = ( 1, "hoge", 3 ); print "scalar @arrray\n"; print "$#array\n";
出力結果↓
3 2
要素数は3で、添字は0,1,2なので、最後の要素の添字は2になります。
◼︎範囲演算子
リスト内に連続する値(1〜5)などを入力する場合は範囲演算子..
を使って表すこともできます。数値だけでなく配列で組み合わせることもできます。
my @array1 = ( 1, 2 ); my @array2 = ( 1 .. 5 ); my @array3 = ( 1, @array1, 2 ); print "@array2\n"; print "@array3\n";
出力結果↓
1 2 3 4 5 1 1 2 2
◼︎reverse
リスト内を逆の順番で表示させたいときはreverse
をリスト前につけます。
範囲演算子..
と一緒にreverseつけることもできます。
しかし、範囲演算子..
の左右を逆にしても、reverseと同じように表示されず、空の要素が格納されます。
my @array1 = ( 5, 4, 3, 2, 1 ); my @array2 = reverse @array1; print "@array2\n"; my @array3 = reverse ( 1 .. 5 ); print "@array3\n"; my @array4 = ( 5 .. 1 ); print "@array4\n"; #NG
出力結果↓
1 2 3 4 5 5 4 3 2 1
◼︎sort
sort
は配列の要素を並び替えます。
sort { $a <=> $b }
は、数値としてsortされます。
sort { $a comp $b }
もしくはsort
だけだと、文字列としてsortします。
今まで変数は$hoge
や@array
を使ってきましたが、変数でも$a
や$b
はsortで使うためにあらかじめ用意されているので、変数を設定するときは$a
と$b
以外を使うようにしましょう。
my @array1 = ( 5, 4, 3, 2, 1 ); my @sorted = sort @array1; print "@sorted\n";
出力結果↓
1 2 3 4 5
2.配列操作
◼︎末尾要素の追加・削除
push
my @array = ("Shinjuku","Yoyogi"); push @array, "Harajuku"; print "@array\n";
出力結果↓
Shinjuku Yoyogi Harajuku
1行目はおなじみ、@array
にShinjuku,Yoyogi
を格納しています。
2行目で@array
にHarajuku
の末尾に要素を追加します。
3行目で末尾に要素を追加した配列の要素が出力されます。
print "$array[2]\n"
で表示させると、Harajuku
が出力されます。
pop
my @array = ("Shinjuku","Yoyogi","Harajuku"); my $element = pop @array; print "@array\n"; print "$element\n";
出力結果↓
Shinjuku Yoyogi Harajuku
2行目で@array
の末尾の要素(=Harajuku
)を取り除いたものを変数$element
に代入します。
3行目は末尾の要素を取り除いた配列の要素、4行目は取り除いた要素を出力します。
push/popは末尾の要素を追加・取出をします。
◼︎先頭要素の追加・取出
unshift
my @array = ("Shinjuku","Yoyogi"); unshift @array, "Shinokubo"; print "@array\n";
出力結果↓
Shinokubo Shinjuku Yoyogi
2行目で先頭に要素を追加しています。 3行目では先頭に追加された配列の中身が出力されます。
shift
my @array = ("Shinjuku", "Yoyogi", "Harajuku"); my $element = shift @array; print "@array\n"; print "$element\n";
出力結果↓
Yoyogi Harajuku Shinjuku
2行目で変数@array
の先頭の要素(=Shinjuku
)を取り除いたものが変数$element
に代入されます。
3行目では配列の要素、4行目では取り出した要素が出力されます。
unshift/shiftは先頭の要素を追加・取出をします。
3.for文
for文を使うことで、繰り返しの処理を書くことができます。主に2つあって、①配列の内容全て②自分で指定した分のみ出力するパターンがあります。
◼︎配列の内容全て出力パターン
基本的な形。
my @array = ( 1, "hoge", 3 ); for my $var ( @array ){ print "$var\n"; }
出力結果↓
1 hoge 3
配列の内容を全て取り出す場合は、for my $スカラー変数名 ( @配列変数名 ){ .. }
という形をとります。
1行目で変数@array
に「1 hoge 3」が格納されます。
2行目で()の配列変数を順に取り出して、取り出したものを変数$var
に入れます。
3行目で変数$var
の内容をprint
で出力させます。
この作業を、for文で、配列の要素がすべて終わるまで繰り返します。
◼︎自分が指定した条件の分だけ取り出すパターン
my @array = ( 1, 4, 3, 5, 1, 3 ); for ( my $i = 0; $i < 5; $i++ ){ print "$array[$i]\n"; }
出力結果↓
1 4 3 5 1
条件を指定する場合、for ( 初期条件; ループ条件; 増分 ) { .. }
という形で表せます。
2行目では変数$i
を宣言し、3行目の{}の内容を、(0からスタートして
;全部で3回未満(0,1までなので2回分)繰り返しをする
;1つずつ増やしていく
)という意味になります。
i++
=0から1つずつ増やしていく
というのは、i--
=1つずつ減らしていく
にもなりますし、自分でどんな風に繰り返すのかを指定することができます。
上記は添字を変数i
として、添字が4までの変数を取り出し、並べました。
条件を指定して、当てはまらなくなるまで(条件が偽になるまで)、{}内が繰り返されます。
今回は配列とfor文に関してでした。
格納しておいたデータを、全て読み出したり、ある一定の部分だけに絞ったり、前に付け加えたり、取り出したり、とどう複数のデータを扱うかをみていきました。
変数とは?配列とは?を押さえておくと@
や$
などシジルの使い分けが自然にできるかなと思います。
次回はハッシュについてみていきます!