Gaiax TechEgg's Blog

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

基礎① 7.サブルーチンをやってみた

今回はサブルーチンについてです!
どんな時に役に立つのか、考えながらやっていきましょう!
配列、リファレンス、など今までの知識を
ふんだんに使うので復習にもなります:)

エンジニア基礎①
1. Perl環境基礎
2. Hello,world!
3. Perl基礎
4. 配列・for文
5. ハッシュ
6. リファレンス
7. ⭐️ サブルーチン ⭐️
8. 正規表現
9. Amon2 入門 第一部
10. Amon2 入門 第二部

ゴール🏁(めやす:30分)


  • サブルーチンがわかる
  • サブルーチンを作れる
  • リファレンス渡しができる

おさえておきたいこと


サブルーチン

意味や内容をひとまとまりにしたもののことをいいます。モジュール化ともいい、自分で関数を作成・定義するための手法です。そのため「ユーザ関数」と呼ばれたりもします。

たとえば、3人の教科ごとの平均を取りたいとき、
今までの方法なら、まず配列に挿入して合計や個数や平均の変数を定義して、計算して・・・という方法でしたが、

my @kokugo = (80, 70, 65);
my $count1 = 0;
my $sum1   = 0;
for my $score (@kokugo) {
    $sum1 += $score;
    $count1 ++;
}
print "$sum1 / $count1\n";


my @sugaku = (80, 88, 60);
my $count2 = 0;
my $sum2   = 0;
for my $score (@sugaku){
    $sum2 += $score;
    $count2 ++;
}
print "$sum2 / $count2\n";

.
.

サブルーチンだと、以下のように最初に平均を出す方法を定義することで、ひとつひとつの数字に対しての変数定義の数が減ったりや計算式などは省くことができます!

sub ave{
        my($i,$j,$k) = @_;
        my$sum = ($i+$j+$k)/3;
        return print"$sum\n";
}

my $kokugo = ave(80, 70, 65);
my $sugaku = ave(80, 88, 60);
.
.

何回もおなじことを繰り返したいとき、修正箇所を極力抑えたい場合など、サブルーチンを使うと簡単にできるようになるのです!

いざスタート!


1. サブルーチン

このようなサブルーチンがあったとします!

sub foo {
    my $hoge = shift @_;
    print "$hoge\n";
}
foo("hello,world!");
foo("hi,Bob!");

◼︎サブルーチンの設定

sub サブルーチン名 { 処理 }

上記の例だとfooが「サブルーチン名」で{ my $hoge ... }が処理内容になります。
サブルーチン名は変数名と同じようにつければOKです!大文字・小文字の英数字とアンダーバー(先頭も可)が使用可能です。*ただし、数字から始められないのでそこだけ注意です!

◼︎サブルーチンの呼び出し

サブルーチンを設定したら、

サブルーチン名 ("...");


で呼び出します。上記だと

foo("hello,world!");
foo("hi,Bob!");


の部分になります。()内に先ほど設定したサブルーチンが適用されます!

◼︎サブルーチンの引数

サブルーチンの引数には@_という配列を用います。
サブルーチンに与えられた引数が格納されている*@_は省略することができます。

sub foo {
    my $hoge = shift;
    print "$hoge\n";
}
foo("hello,world!");
foo("hi,Bob!");


2. サブルーチンをつくってみる!「add」

二つの引数を受け取り、その和を返すサブルーチン「add」をつくってみましょう。

sub add{
    my ($left, $right) = @_;
    return $left + $right;
}
my $result = add(7, 22);
print "$result\n";


29


サブルーチンに複数の引数が与えられた場合、配列のように,(コンマ)で区切って渡すと、$leftには7が、$rightには22が入ります。
返り値returnをつかうことで、任意のデータ($left + $right)を呼び出し、元へ返す($resultに格納する)ことができます。

3.返り値

◼︎返り値return複数ある場合

返り値が複数ある場合は以下の挙動になります。

sub compare {
    my ($i, $j) = @_;
    if ($i == $j) { 
        return "true";
    } else { 
        return "false";
    }
}

my $result = compare(4,4);
print "$result\n";


true


returnに達した場合はそれ以降の処理は全く行われず、終了します。今回の場合はi=j=4で最初の条件に正であったため、trueを呼び出し、$resultに格納しています。
i=4,j=5にした場合、以下のようになります。

sub compare {
    my ($i, $j) = @_;
    if ($i == $j) {
        return "true";
    } else {
        return "false"; 
    }
}

my $result = compare(4,5);
print "$result\n";


false


◼︎返り値をかかなかった場合

返り値returnをかかなかった場合の挙動をみてみましょう。

sub add{
    my ($left, $right) = @_;
    $left + $right;
}
my $result = add(7, 22);
print "$result\n";


29


返り値をかかなかった場合は、最後の実行結果である$left + $rightが適用されます。

4.リファレンスで引数をわたす方法

なぜサブルーチンにリファレンス!?とお思いの方、リファレンスを少し思い返してみましょう。

gaiax-techegg.hatenablog.com

「おさえておきたいこと」で「サブルーチンなどで引数をわたすときに複数の配列やハッシュが指定可能になります。」と記述しました。
配列は一次元しか取れないために、二次元以降にしたいときはリファレンスをしてスカラ値にしてからまた配列として格納します。
今までの学習を元にした方法とリファレンス渡しの方法を比べてみましょう。
配列@hoge``@fooの中身を二段に分け展開するサブルーチン「output」を作りましょう!

◼︎今までの方法

my @hoge = ("hoge", "fuga");
my @foo  = ("foo", "bar", "baz");
sub output {
    my (@array1, @array2) = @_;
    print "@array1\n";
    print "@array2\n";
}
output(@hoge, @foo);


hoge fuga foo bar baz
(空白の行)


なんで2つに分けた変数が一緒の行になってしまったのか??
my (@array1, @array2) = @_;hoge fuga foo bar baz@_に格納されます。しかし、printで出力する際に、@array1@array2の境がわからず、@array1hoge fuga foo bar bazすべてをいれてしまいます。

そこで以下のようなリファレンスで引数の渡しをします。

◼︎リファレンスで引数を渡す方法

my @hoge = ("hoge", "fuga");
my @foo  = ("foo", "bar", "baz");
sub output {
    my ($array1, $array2) = @_;
    print "@$array1\n";
    print "@$array2\n";
}
output(\@hoge, \@foo);


hoge fuga
foo bar baz

my ($array1, $array2) = @_;により、@_にスカラ値である$array1$array2つ入れます。これで出力する際に、先ほどみたいなことはおこりません!
スカラ値で設定しているのでoutput(\@hoge, \@foo);で呼び出すときはリファレンスを行い、配列変数からスカラ変数に変えます。
これがリファレンスで引数を渡している方法です。

リファレンスで渡す方法は同じようにハッシュの場合もできます。



サブルーチンは使えるようになるとすごく便利なので
ぜひ使いこなしたいですね!!!


次回は正規表現についてです!!
正規表現とっても楽しいですよ!
Perlでは「正規表現」でまるまる一冊本があるくらい奥深いですが、
やってみるととっても楽しい!!

*部分は内容補足しました(9/7)

基礎① 6.リファレンスをやってみた

今回はリファレンスに関してやっていきます:)
私もつまづいたリファレンス・・・。。。

ハッシュ
gaiax-techegg.hatenablog.com
や配列

gaiax-techegg.hatenablog.com


をおさらいしておくとベターかもです。
この回でも例もたくさん載せているので、ぜひ書いて動かしてみてください!

エンジニア基礎①
1. Perl環境基礎
2. Hello,world!
3. Perl基礎
4. 配列・for文
5. ハッシュ
6. ⭐️ リファレンス ⭐️
7. サブルーチン
8. 正規表現
9. Amon2 入門 第一部
10. Amon2 入門 第二部

ゴール🏁(めやす:30分)



リファレンス

スカラー・配列・ハッシュなどの変数は、データを記録するためのものです。それに対して、リファレンスは値を記録する代わりに、値を格納しているアドレスを記録します。これをすることによって二次元配列など複雑な構造などを作成することができます。これから登場しますが、サブルーチンなどで引数をわたすときに複数の配列やハッシュが指定可能になります。

・スカラー変数 / 配列 / ハッシュ:ユーザが指定した値を記録し、後から変数名を使ってその値を呼び出すためのもの
・リファレンス:変数名にリンクされたアドレスを記録する操作
・デリファレンス:リファレンスから元のスカラーや配列やハッシュなど値を得るための操作


リファレンスする場合はスカラー変数・配列・ハッシュのそれぞれのシジルの前に\(バックスラッシュ)を置くことでリファレンス操作ができます。

二次元配列

このようなテーブル型のように縦横の二次元で配列を考えた場合のことを指します。基礎① 4.配列で出てきた配列は、縦のみの一次元配列のことです。

number name place famous
no1 Tokyo Japan TokyoTower
no2 Paris France EiffelTower


この場合、Tokyoの要素はtable[1][1]EiffelTowerの要素はtable[2][3]になります。

デリファレンス

リファレンスでは値そのものではなく、アドレスを得ることができます。アドレスではなく値を直接得たいときは、デリファレンスをすると、元のスカラーや配列やハッシュなど値そのものを得ることができます。

デリファレンスする場合はリファレンスの前にスカラー変数・配列・ハッシュのそれぞれのシジルを置くことでデリファレンス操作ができます。

いざスタート!


1. リファレンス

スカラー・配列・ハッシュをそれぞれリファレンスしてみましょう。
リファレンスする場合はスカラー変数・配列・ハッシュのそれぞれのシジルの前に\(バックスラッシュ)を置くことでリファレンス操作ができます。

◼︎スカラーのリファレンス

my $scalar     = "scalar";
my $scalar_ref = \$scalar;
print "$scalar_ref\n";


SCALAR(0x7f906a81fed0)

◼︎配列のリファレンス

my @array     = ( "apple", "blue", "cat" );
my $array_ref = \@array;
print "$array_ref\n";

または[角括弧]で配列の要素をくくることで、配列リファレンスになります。

my $array_ref = [ "apple", "blue", "cat" ];
print "$array_ref\n";


ARRAY(0x7f97998248d0)


配列をリファレンス化するときにシジルが@から$に変わっているのは、配列全体が一つの変数としてアドレスに収納されるからです。一つの変数=スカラー変数でしたね!なのでシジルは$になります。

◼︎ハッシュのリファレンス

my %hash     = ( name => "micky",
                place => "DisneyLand" );
my $hash_ref = \%hash;
print "$hash_ref\n";

または{波括弧}でくくることで、ハッシュリファレンスになります。

my $hash_ref = {
    name  => "micky",
    place => "DisneyLand"
};
print "$hash_ref\n";


HASH(0x7fa453823cd0)


配列と同様に、ハッシュをリファレンス化するときにシジルが%から$に変わっているのは、ハッシュ全体が一つの変数としてアドレスに収納されるからです!
上記のようにリファレンスはSCALAR(アドレス)ARRAY(アドレス)HASH(アドレス)で出力されます。( )内は実行環境によって異なります。値そのものではなく、アドレスが表示されます。

2. デリファレンス

リファレンスで、アドレスを参照してきました。リファレンスしたものをデリファレンスすることで値そのものを参照してみましょう!
デリファレンスする場合はリファレンスしたもの前にスカラー変数・配列・ハッシュのそれぞれのシジルを置くことでデリファレンス操作ができます。

◼︎スカラーデリファレンス

my $scalar     = "scalar";
my $scalar_ref =\$scalar;
print "$$scalar_ref\n";


scalar

◼︎配列のデリファレンス

1.配列の中身を参照

my $array_ref = [ "apple", "blue", "cat" ];
print "@$array_ref\n";


applebluecat

2.要素の取り出し
配列リファレンスをスカラーとしてデリファレンスして{ }でくくり、添え字と出力すると、通常の配列のように出力できます。

my $array_ref = [ "apple", "blue", "cat" ];
print "$array_ref->[2]\n";


cat

◼︎ハッシュのデリファレンス

1.ハッシュの中身を展開
keyとvalueが展開されます。

my $hash_ref = {
    name  => "micky",
    place => "DisneyLand"
};
print "%$hash_ref\n";


namemickyplaceDisneyLand

2.要素を取り出す場合
配列のデリファレンスと同じように、ハッシュリファレンスをスカラーとしてデリファレンスして{ }でくくり、keyを入力するとそれに対応するvalueが得られます。

my $hash_ref = {
    name  => "micky",
    place => "DisneyLand"
};
print "$hash_ref->{place}\n";


DisneyLand

3.モジュールを使ってみる

リファレンスのあと、デリファレンスで中身を一回一回確認するのはなかなか苦労がかかります・・・そこで!!Data::Dumperモジュールを使ってみましょう!

use Data::Dumper;
my $hash_ref = {
   name      => "micky",
   place     => "DisneyLand",
   friend    => "minne"
};

print Dumper($hash_ref);


$VAR1 = {
          'name' => 'micky',
          'friend' => 'minne',
          'place' => 'DisneyLand'
        };


print Dumper()で( )の中身を一気に見ることができます!モジュールも使いようですね!


どうでしたか?
リファレンスでは今までの変数についての内容を使いましたね!
モジュールも知っておくと手間が省けるようになりますね!
これからも紹介していきます!

次回はサブルーチンについてです!:)
サブルーチン楽しいですよー!お楽しみに!

基礎① 5.ハッシュをやってみた

最近暑いですねー(´-`).。oO
夏バテしてしまって、夕飯アイスな私です。

今回はハッシュについてやっていきたいと思います!:)

エンジニア基礎①
1. Perl環境基礎
2. Hello,world!
3. Perl基礎
4. 配列・for文
5. ⭐️ ハッシュ ⭐️
6. リファレンス
7. サブルーチン
8. 正規表現
9. Amon2 入門 第一部
10. Amon2 入門 第二部


ゴール🏁(めやす:30分)


  • ハッシュがわかる

おさえておきたいこと


ハッシュ

前々回の変数の紹介でも出てきた連想配列のことです。

gaiax-techegg.hatenablog.com


- スカラ変数:一つの要素しか入らない箱
- 配列 / 連想配列:複数の要素を格納できる箱


ハッシュは、前回扱った配列とおなじように、複数の値の格納・取り出しができます。
配列はある変数に複数の要素が組み込まれていました。つまり、Aに対してB,C,D...を組み込み、何番めかを指定して要素を取り出していました。

その点、ハッシュは「Aに対してB」が、「Cに対してD」を呼び出すというふうに、「キー」(=AとかC)と「値」(=BとかD)を一組のペアとして関連づけされていて、完全に1対1の関係を保っています。

「キー」のことを「key」、keyによって指定された「値」のことを「value」といいます。
また、配列のシジルは@でしたが、ハッシュは%をつけます。


では基本の形から詳しく見ていきましょう。

いざスタート!


1. ハッシュ

ハッシュを呼び出すときは$hash{key名}を使います。
シジルが$なのは、配列のときと同じで、ハッシュ変数のなかで1つだけ表示するので、スカラー変数として扱われます。
=>はファットコンマ演算子といい、key => valueというふうに使い、keyとvalueの関係性を表します。

◼︎基本

my %hash = (
   name => "Alice",
   age  => 22
);
print "$hash{name}\n";
print "$hash{age}\n";


1行目:hash変数の定義、要素は()内に入れます
2行目:key:nameにvalue:Aliceを対応付け
3行目:key:ageにvalue:22を対応付け(数値の場合はクォートをつけなくても◎)
4行目:要素の終わり
5行目:key:nameに対応しているvalue:Aliceを取り出す
6行目:key:ageに対応しているvalue:22を取り出す
というふうになります。ハッシュの要素を並べるときは,(カンマ)で区切ります。

上記はこのようなリストと同じ意味になります。

my %hash = ("name","Alice","age","22");
print "$hash{name}\n";


出力結果↓

Alice


この場合はnameというkeyを呼び出したので、Aliceが表示されました。

上記の基本と比べてみると、,と同じ役割ですが、ファットコンマ演算子で関係性を示したほうが視覚的にわかりやすいですね!

◼︎ハッシュの良さ
基本的な形がわかったところで、実際に配列とハッシュの違いを見てみましょう。

my @data = ("Name", "Age", "Birthday");
print "$data[0]\n";

上記の配列において、Nameを取り出したいとします。

my @data = ("Birthday", "Name", "Age");
print "$data[0]\n";

このように、リスト内の順番が入れ替わったとき、「何番めの要素か?」を手掛かりにしてNameを呼び出すため、print "$data[0]\n";だとBirthdayが取り出されてしまうので、添字を書き換えないといけないですね。
ハッシュだと、順番ではなくkeyを手掛かりにvalueを指定するデータ構造になっているので、配列に比べて順序が変わった場合に書き換える必要がないのが便利です。

ハッシュで表した場合は下記のようになります。

my %hash = (
   first    => "Name",
   second   => "Age",
   third    => "Birthday"
);

my $data = delete $hash{second};
print "$data\n";


これからでてきますが、delete関数second(=key)に対応するAge(=value)を指定しています。
もし()内の、first,second,thirdの順番が変わったとしても、表示される内容はAgeで固定されたままです。
これがハッシュと配列の違いです。

2. ハッシュ関数

ハッシュを操作するためにハッシュ関数が用意されています。

関数 内容
keys すべてのキーを取り出す
values すべての値を取り出す
each 1組のキーと値を取り出す
delete 特定の要素を削除・取り出しをする
exists 指定したキーが存在するか確認する


◼︎keys

すべてのkeyを取り出します。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
my @data = keys %hash;
print "@data\n";


出力結果↓

name age birthday


my @data = keys %hash;で、keys関数がハッシュ%hash@dataという配列として、次の行で順不同で出力しています。

◼︎values

すべての値を取り出します。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
my @data = values %hash;
print "@data\n";

出力結果↓

Alice 22 19930722


my @data = values %hash;で、values関数がハッシュ%hash@dataという配列として、次の行で順不同で出力しています。

◼︎each

1組のkeyとvalueを取り出します。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
my @data = each %hash;
print "@data\n";


出力結果↓

age 22


my @data = each %hash;でどれか1組のkeyとvalueを取り出します。今回はageでしたが、ほかの表示結果もあると思います。

◼︎delete

特定のkeyとvalueを削除・取り出しをします。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
delete $hash{'age'};

key:ageに対応するvalue:22をハッシュ内より消去したので、今ハッシュ内は

my %hash = (
   name     => "Alice",
   birthday => "19930722"
);

のようになっています。
さっきのkeys関数などで呼び出してみると、keyがname birthdayしかないことが確認できます。
また、上記の「◼︎ハッシュの良さ」でも登場しましたが、ひとつのvalueを取り出すこともできます。

◼︎exists

指定したkeyが存在するか確認できます。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
if (exists $hash{age}){
    print "exist\n";
}


出力結果↓

exist


if文を用いて、ageというkeyが存在するかどうかをexists関数で確認して、存在する場合(この条件に真の場合)「exists」と出力するようにしてます。もし存在しない場合(この条件に偽の場合)は空白のまま何も表示されません。もし偽の場合も表示させるのなら、以下のようにelse文を足します。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);

delete $hash{age};
if (exists $hash{age}){
    print "exist\n";
}else{
    print "not exist\n";
}


delete関数でkey:ageを消していて、存在していないので表示はnot existになったと思います。delete関数で削除したものも、こうして確認ができますね!

以上がハッシュになります!

3. 実践編

ハッシュについてはわかったでしょうか!?でも自分で実際につくってみないと、わからないですよね!今回は実践編として問題を準備しました!ぜひやってみてください。

1.ハッシュを使ってprofile.plで自分のプロフィールを作りましょう(名前、性別、年齢、誕生日、仕事)
2.どれか1組のkeyとvalueを表示させてみましょう
3.表示されたkeyとvalueを削除し、「存在しています」「存在していません」と表示が出るようにしましょう

回答↓
順番に行うと以下のようになります。名前などは自分のプロフィールにおきかえてくださいね!

1,2番までの回答

my %hash = (
   name      => "Marimo",
   sex       => "female",
   age       => "22",
   birthday  => "19930722",
   job       => "student"
);                             #ここまでが1

my @profile = each %hash;
print "@profile\n";            #ここまでが2

3の回答

my %hash = (
   name      => "Marimo",
   sex       => "female",
   age       => "22",
   birthday  => "19930722",
   job       => "student"
);                             #ここまでが1

delete $hash{sex};             #2で表示されたものを消す

if (exists $hash{sex}){
    print "存在しています\n";
}else{
    print "存在していません\n";
}                  #ここまでが3

です!
できましたか!?
自分で色々いじってみるとだんだん使い方が見えてくると思います!
いじり精神が大切です!
これができたらハッシュ完璧です!


次回は最初はだれでも頭が???になる
リファレンス・デリファレンスについてやっていきまーす!:)

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

基礎① 3.Perl基礎をやってみた

第3回目の今回は基本的な四則演算とif文をあつかっていきます!

エンジニア基礎①
1. Perl環境基礎
2. Hello,world!
3. ⭐️Perl基礎⭐️
4. 配列
5. ハッシュ
6. リファレンス
7. サブルーチン
8. 正規表現
9. Amon2 入門 第一部
10. Amon2 入門 第二部

ゴール🏁(めやす:30分)


  • Perlの基礎がわかる
  • 四則演算を使って計算することができる
  • if文を使えるようになる

おさえておきたいこと


変数

変数=データを格納できる箱です。Perlが扱う変数には「スカラ変数」「配列」「連想配列(ハッシュ)」があります。

  • スカラ変数:一つの要素しか入らない箱
  • 配列 / 連想配列複数の要素を格納できる箱

変数の宣言はmyで、変数を扱うときは、変数の前に$をつけます。表すとこんな感じ!

my $hoge;
$hoge = 1;

これは1行目で変数hogeがあることを宣言し、2行目でhogeに1を代入するという意味です。=という演算子は代入を意味します。

my $foo = 1;
$hoge = "perl";

これは1行目で変数fooがあって、それに1を代入し、2行目で変数hogeがあってperlって意味を代入する、という意味です。文字を代入する場合は""で囲いましょう。

my $foo = 1;
print "$foo\n";
print '$hoge\n';

これは1行目はもう何を示すかわかりますね!2行目と3行目は画面に出力しています。""(ダブルクォーテーション)だと、変数の中身が展開されて1と表示、''(シングルクォーテーション)だと全てが出力されるので$hoge\nと表示されます。

以上が変数の入出力でしたー!

標準入力

前回でHello,world!を出力することはできましたよね!今度は入力されたものを受け取って、出力するコードを書きましょう。

my $hoge = <STDIN>;
chomp $hoge;
print $hoge;

1行目で入力された文字列を(=standard in)として受け取って、入力された文字列を変数hogeに代入します。2行目で、入力の際に生じた行末の改行を削除します。3行目で入力した文字列の出力です。

いざスタート!


0. おまじない

#!/usr/bin/env perl
use strict;
use warnings;

この三行がいわゆる「おまじない」といわれるもの。
冒頭に必ずいれましょう!
2行目は厳密な書式を定めたり、未定数の変数を警告してくれて(致命的なミスの発見!)、 3行目は正しくない記述をした際に警告文を出してくれます。(致命的ではないけど正しくないミスの発見!)

1. 四則計算

◼︎数字だけの四則計算

my $hoge = 4;
my $foo  = 2;

print $hoge + $foo;    # 4 + 2 = 6
print $hoge - $foo;    # 4 - 2 = 2
print $hoge * $foo;    # 4 * 2 = 8
print $hoge / $foo;    # 4 / 2 = 2
print $hoge % $foo;    # 4 % 2 = 0
print $hoge ** $foo;   # 4 の 2乗 は 16

%はa÷bのあまりを意味します。

◼︎文字列を含む四則計算

my $hoge = 'perl';
my $foo = 123;
my $bar = $hoge . $foo;          # perl123
print $hoge . $foo . "\n";       # perlperl123

.によって文字列や変数を連結することができます。4行目は改行を入れたい場合は""で囲みましょう。

2. if文

if分は制御構文といいます。2つ以上のものを比較するときに条件を定めて、「真」(=条件が正しい)の場合の出力、「偽」(=条件が正しくない)の場合の出力を決められます。

◼︎基本的なif文

my $hoge = 1;
if ( $hoge == 1 ) {
  print "OK\n";       # 条件が「真」の場合
} else {
  print "NG\n";       # 条件が「偽」の場合
}

1行目はもうわかりますね!
2行目では条件を()内に記してあります。==とは左辺と右辺の内容が正しいということです。
3行目以降は、「変数hogeが1と等しい」という条件に関して真の場合はOKと表示し、偽の場合はNGと表示するという意味です。セミコロンは最後につけなくて大丈夫です!


◼︎数値の比較演算子

数字を用いる場合は以下のような比較演算子を使います。

==       # 右辺と左辺が等しいならば真
!=       # 右辺と左辺が等しくないならば真
<        # 右辺より左辺が小さいならば真
>        # 右辺より左辺が大きいならば真
<=       # 右辺が左辺以上ならば真
>=       # 右辺が左辺以下ならば真


◼︎文字列の比較演算子

文字を用いる場合は以下のような比較演算子を使います。

eq  ==     # equal
ne  !=     # not equal
gt  >      # greater than
ge  >=     # greater equal
lt  <      # less than
le  <=     # less equal

◼︎文字列の比較

先ほどの基本的なif文では数値のみでしたが、文字列の比較もできます!文字列の比較演算子を使います。

my $hoge = 'perl';
if ( $hoge eq 'perl' ) {
    print "OK\n";
} else {
    print "NG\n";
}

◼︎こういう場合はどうなるの?パターン

①数字を文字列の比較演算子でする場合

if ('72' eq 72) {
  print "OK\n";
}

この場合、Perlでは数字を文字列として解釈するので、OKという出力になります!

②数字と文字列の混合の場合

if ('72perl' == 72) {
  print "OK\n";
}

文字列を数値用の比較演算子で比較しようとするとエラーが出ますが、Perlは文字列を無理やり数値として解釈して処理をします。今回は先頭に72という数値が含まれるので、==が成り立ち、真となります。


◼︎複数の条件を提示する場合

my $hoge = 1;
if ( $hoge == 1 ) {
    print "one\n";
} elsif ( $hoge == 2 ) {
    print "two\n";
} elsif ( $hoge == 3 ) {
    print "three\n";
} else {
    print "number\n";
}

elsifで条件をさらにつなげることができます!この場合、出力されるのはoneですね!

◼︎関係演算子

複数の条件を扱いときは関係演算子で表します。

&&    -> かつ
||    -> または

おなじみですね!
&&は両方の条件が真の場合、||は条件のどちらか一方の場合が真ならば真になります。

◼︎関係演算子を用いたif文

my $hoge = 64;
if ( $hoge > 0 && $hoge % 2 == 0 ) {
    print "&&: OK\n";
}
if ( $hoge > 0 || $hoge % 2 == 1 ) {
    print "||: OK\n";
}

この場合の出力は&&: OKになりますね。
2行目は変数hogeが正かつ2で割り切れる条件、5行目は変数hogeが正でかつ1余る条件を示しています。

Perlでif文を用いる場合は if else elsif で表せます!


前回のHello,world!の出力から、if文を出力できるようになると、だいぶ幅が広がった気がしますね!
数値、文字列の場合の条件をうまく使い分けていくのが肝です!
次回はfor文から配列操作までやっていきまーす!
次回記事!

gaiax-techegg.hatenablog.com

基礎① 2.Hello,world!を表示させてみた

今回はPerl言語で「Hello,world!」表示させることをやってくよー!

エンジニア基礎①
1. Perl環境基礎
2. ⭐️Hello,world!⭐️
3. Perl基礎
4. 配列
5. ハッシュ
6. リファレンス
7. サブルーチン
8. 正規表現
9. Amon2 入門 第一部
10. Amon2 入門 第二部

ゴール🏁(めやす:30分)


  • vimを使うことができる
  • スクリプトを実行することができる
  • 必要なコマンドを使える

必要なもの


  • ターミナル
    f:id:fukufukumarimo:20150706171243p:plain
    これは前回もモジュールをインストールしたりして使いましたね!
    おっと!今回からはターミナルさえあればだいじょうぶです!💪

おさえておきたいこと


いままでデータを保存したり、ファイルを作ったり書き加える場合は、
1.「ファイルをひらく」→2.「そのファイルに書き込む」→3.「名前を付けて保存」
という順番でやっていたと思いますが、プログラムをする場合は、
「名前を保存する場所をつくる」→「そのファイルをひらく」→「そのファイルにプログラムを書き込む」
(3.「名前を付けて保存する」→1.「ファイルをひらく」→2.「そのファイルに書き込む」)
の順番になります:)
順番が逆になるんですね!これさえ頭に入れれば大丈夫!

おさえておきたいことば


ホームディレクトリ

PC上でユーザーごとに利用できるフォルダ・ファイルなどデータをサーバで保管できる場所のこと。
Finderでは🏠家マークの隣にユーザー名が書かれている場所のことで
f:id:fukufukumarimo:20150715135148p:plain
↑では🏠ホームにあたります。
デフォルトではFinderのメニューバーには表示されないかもしれません。
以下のように、自分で、Finderの環境設定でメニューバーの表示を変更しておいとくこともできますよ。
f:id:fukufukumarimo:20150715135609p:plain

ターミナルではホームディレクトリは「」と表示されます。

vimのモードの切り替え

vimには「ノーマルモード」「コマンドモード」「入力モード」「ビジュアルモード」の4種類があります。

モード
ノーマルモード いつもの状態のこと。キーで上下移動やコピペの操作ができるモード。
コマンドモード 「:(コロン)」でノーマルモードより切り替え。保存や行の操作ができるモード。
入力モード 代表的なのは「i」でノーマルモードより切り替え。文字の入力・編集するモードです。
ビジュアルモード 「v」でノーマルモードより切り替え。テキストを文字や行単位で選択し、選択したテキストに対してvimのコマンドを適用できる操作です。


ノーマルモードに戻す際は「esc」で戻れます!
よく使うのは「コマンドモード」と「入力モード」です!
モードの切り替えをしたい際は一回ノーマルモードに戻ってからになります。
ノーマルモード→入力モード→ノーマルモード→コマンドモード、のような感じで、モード切り替えになります!
今回の流れでモードの切り替えも一緒に見ていきましょう!

Hello,world!表示させよう:)


1.フォルダを作る

今回、プログラムを書いていくにあたって、いろんなファイルを作っていくことになると思います。
他のファイルと混じってしまうと整理がしにくくなるので、ディレクトリ(厳密には違いますがフォルダのようなもの)をあらかじめ作っちゃいましょう!
自分がまずいる場所を確認します!
f:id:fukufukumarimo:20150715132354p:plain
[PC名]:[ディレクトリ名] [ユーザ名] $ の表示になっています。
pwdと入力すると現在自分がいる場所(=カレントディレクトリ)を示します。
「ホームディレクトリ」にある「フォルダ・ファイル一覧」を表示させるには
lsと入力すると、一覧が出ます。

ここで、「perl」というフォルダを作ってみましょう。
フォルダを作るときはmkdir [dir名]を実行すると作れます。
フォルダを作れたか確認するときはls表示で確認します。
f:id:fukufukumarimo:20150715133601p:plain
perl」フォルダの確認できましたか!?

perlフォルダの中に移動したいときはcd [dir名]で移動できます。
f:id:fukufukumarimo:20150715133900p:plain
ディレクトリ名がからperlに変わったのをもう一回pwdで確認
f:id:fukufukumarimo:20150723163238p:plain
上の表示がでればOK!👍

2.ファイルをつくる

Perlでの拡張子(どんなファイルか判別するためのファイル名のあとにつけるもの)は.plです。
今回のHello,world!ではhello.plというファイルを作りましょう。

$ vi hello.pl

vi [ファイル名]でファイル名を作り、開くことができるようになります。

3.ファイルに書き込む

黒画面の一番下に"hello.pl" [New File]と表示されていますか?
いま、コマンドモードになっているので、ここで「i」を押してみてください。
"hello.pl" [New File]から-- INSERT --に変わったと思います。
これで入力モードになりました。
「i」は「INSERT」の頭文字からとったもので、これでファイルに書き込むことができます!
今回は「Hell,world!」と表示させるには

print "Hello,world!\n";

と入力します。
print "文字列"; =「文字列」を表示させます。
最後のセミコロン=;を忘れずに!
\n=改行を意味します。

4.ファイルを保存する

まずescボタンを押すことで入力モードからコマンドモードにもどります!
:wq(=上書き保存して終了)を入力すると、もとの画面に戻ります。
これでさっき作ったプログラムは保存されました。

5.プログラムを実行する

実行する場合は

$ perl hello.pl

でできます。perl [ファイル名]でファイルを実行します。

結果出ましたか?

Hello,world!

と表示されていれば成功です!★

おまけ


◼︎ターミナルコマンドまとめました(超基本なもの厳選)

コマンド 意味 結果
pwd print working directory カレンドディレクトリを示す
cd [dir] change directory ディレクトリに移動する
cd .. change directory 一つ上のディレクトリにもどる
mkdir [dir] make a directory ディレクトリを作成する
ls list フォルダ、ファイルのリストを表示する
rm [file] [dir] remove このディレクトリのファイルを削除する
mv [file] [dir] move このディレクトリへファイルを移動する
cp [before] [after] copy beforeをafterへコピーする


◼︎vimでよく使うキーまとめました(知らないとこまっちゃうもの厳選)

キー 結果
:wq 上書き保存して終了
:w 保存
:q 保存せず終了
:q! 強制終了
i カーソルの位置から入力モード
I 行頭から入力モード
a カーソルの直後から入力モード
A 行末から入力モード
C カーソル以下の行を削除する
D カーソル以下の行を削除して入力モードになる


以上になります!
vimコマンドは本当にいっぱいあります!
徐々に使い慣れていきましょう:)
次回はいよいよ四則計算から基本的な構文をやっていきます!
入力する量も圧倒的に増えます!
おたのしみにー!
次回記事!

gaiax-techegg.hatenablog.com

番外編 #2 Homebrew経由でRictyインストールしてみた

前回の記事

gaiax-techegg.hatenablog.com

に書ききれなかったエンジニア御用達のフォント「Ricty」をHomebrew経由で インストールする方法をまとめました☝️

ゴール🏁(めやす15分)


  • Homebrewを理解してインストールできる
  • Rictyをインストールできる

おさえておきたいことば


パッケージ管理システム

パッケージとは実行ファイルや設定ファイル、ライブラリ(モジュール)などを一つのファイルとしてまとめているものです。そのパッケージのインストール作業を一元的に管理するものがパッケージ管理システムです。

リポジトリ

プログラムなどが保管さている場所のこと。アプリケーションやシステムの設定情報がまとめて記録されているファイルやフォルダや、複数の開発者が参加するプログラミング環境においてソースコードや仕様に関する情報をネットワーク上や直接サーバ上などリポジトリとして設置して保管します。

フォーミュラ

ビルド方法・手順が書かれたスクリプトのことで、つまりパッケージのことですが、Homebrew関連ではformulaで表記されることが多いです。リポジトリのなかにフォーミュラがあり、それをコマンドを使ってformulaを取得できます。

Homebrew

MacOS Xにおいてソフトウェアの導入を簡易化するパッケージ管理システムのこと。類似のパッケージ管理システムは、macportsfinkなどがあります。今回Homebrewを使うのは、インストール時間が短く、なるべくMacにある機能を使ってくれて、余計にあたらしくインストールしなくても良いからです。 Homebrewはこんな意味があります。

名前 意味 たとえ
brew 醸造する ビルドする
Homebrew ビールを自家で醸造する 自分でビルドする
keg 樽、醸成用 ビルドする材料
Celler ワインセラー 保存場所
formula 方法・手順 方法手順が書かれたスクリプト

Homebrewは手順(調理法formula)通りにパッケージをビルド(醸造)して保存(/usr/local/cellerに格納)して、使う(/usr/loca/binにリンク)ってことのようです。

XQuartz(= X11 = X11 for Mac OS X = X Window System

X WindowとはMacWindowsで一般的なウィンドウやフォルダを表示したり、マウスでクリックやドラッグ&ドロップできるといった、視角的な操作をUNIX系のOSでもできるよう開発されたUNIXの伝統的な仕組みのこと。Mac OSXではQuartzと呼ばれる、こういったウィンドウを表示したりする描画機能をもっています。なぜQuartzがあるのにさらにXQuartzを用意しなければならないのかというと、他のOSを使う際に、Macのような表示や操作の互換性を持たせるために仲介するようなイメージでもってもらうとわかりやすいと思います。今回はRictyというフォントを表示させるための仲介役としてインストールします。

Ricty

プログラム扱う人なら御用達のRictyフォント!日本語の表示がすごく見やすい、のと、判別しにくい数字や文字を見やすく設定している、視認性が高いフォントなのです!これからダウンロードしていきます!

Rictyをインストールしよう!


Homebrewを使ってRictyをインストールしましょう!

1.Homebrewのインストール

Homebrew自体のインストール方法は簡単!

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

のあと、途中でEnterの実行とパスワードの入力を催促されます!そして次に

$ brew help

を入力するように促されているので、入力してhelpを確認。

$ brew -v

でバージョンの確認0.9.5の表示の確認。

$ brew doctor

で問題かないかどうかチェックして終了です:)

2.Rictyフォントをインストール!

そしていよいよRictyインストール!
◎下記のtapコマンドを使わずにインストールする場合

$brew install https://raw.github.com/sanemat/homebrew-font/master/ricty.rb

を実行します。こちらが実行結果。
f:id:fukufukumarimo:20150713171738p:plain
⭐️ To Install Rictyの中にある

$ cp -f /usr/local/Cellar/ricty/3.2.4/share/fonts/Ricty*.ttf ~/Library/Fonts/

$ fc-cache -vf

を実行! 実行結果で

fc-cache: succeeded

がでたらRictyインストールできました!

tapを使用してインストールする場合 sanematさんのREADMEを参考に設定していきます。

$ brew tap sanemat/font

$brew tap [ユーザ名]/[リポジトリ名]で公式以外で公開されているリポジトリを取得できます。
このtapコマンドにより今までhomebrewにはなかったフォーミュラ(例えばphpvimなど)やgithubアカウントで所有しているリポジトリを簡単に追加できるようになりました。

$ brew install Caskroom/cask/xquartz

Rictyに必要なXQuartzをインストール。
途中でパスワードを催促されます。
$brew install [フォーミュラ名]でフォーミュラをインストールできます。

$ brew install ricty

Rictyインストール!
終了したら以下手順は、tapコマンドを使用しない場合の⭐️からの手順と全く同じになります!

3.ターミナルで設定する

環境設定 -> プロファイル -> テキスト -> フォント -> 変更
あ、ありましたー!!!!!
f:id:fukufukumarimo:20150713173517p:plain
こ、これでRictyユーザーに見事仲間入り!🎉
Monacoに比べて12pt.だとだいぶ小さくなってしまうので、14pt.以上がおすすめです!

デフォのMonacoとRictyを比べてみましょう。
Monaco↓
f:id:fukufukumarimo:20150714172622p:plain

Ricty
f:id:fukufukumarimo:20150714172653p:plain
だいぶすっきりとした印象ですね!

Ricty Discord↓(自動的に追加されてます)
f:id:fukufukumarimo:20150714173019p:plain
DやZにスラッシュが入ってます!これはわかりやすい!
今回紹介したのはRictyでしたが 自分に合うフォントをぜひ探して使ってください〜😊!

おまけ


$brewコマンドの主な使い方をまとめておきました!

コマンド 結果
$brew install [formula名] インストール
$brew uninstall [formula名] アンインストール
$brew tap [ユーザ名]/[リポジトリ名] リポジトリを取得する
$brew untap [ユーザ名]/[リポジトリ名] リポジトリを削除する
※先にリポジトリ内のformulaを削除しておく
$brew search [formula名] formulaを検索
$brew list formula一覧
$brew info [formula名] formulaの情報
$brew doctor 異常がないかどうか見る
$brew update Homebrewとformulaをアップデートする

以上、HomebrewとRictyのインストール方法でした:)