Gaiax TechEgg's Blog

非エンジニアがエンジニアを目指すブログ

基礎① 4.配列・for文をやってみた

今回やっていくのはこちら!
配列とfor文です!

前回のPerlの基礎として変数を扱いました。
今回はその知識をもっと深めていくので復習にどうぞ!

gaiax-techegg.hatenablog.com

エンジニア基礎①
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行目はおなじみ、@arrayShinjuku,Yoyogiを格納しています。
2行目で@arrayHarajuku末尾に要素を追加します。
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文に関してでした。
格納しておいたデータを、全て読み出したり、ある一定の部分だけに絞ったり、前に付け加えたり、取り出したり、とどう複数のデータを扱うかをみていきました。
変数とは?配列とは?を押さえておくと@$などシジルの使い分けが自然にできるかなと思います。
次回はハッシュについてみていきます!