Perlの基本文法雑記

## きっかけ
~~この期に及んで古の~~ Perlを使う機会が発生したのでキャッチアップした基本文法だけ雑記

## ファイル先頭の記述
``` perl
# エラーチェック
use strict;
# 警告表示
use warnings;
# UTF-8
use utf8;
```

## 標準出力
``` perl
use strict;
use warnings;
use utf8;

# 「print」を使用
print "Perl";
```
出力結果
```
Perl
```

## コメント
``` perl
use strict;
use warnings;
use utf8;

# 単一行コメント
=pod
「=pod」から「=cut」の間が
コメント扱いになる
=cut
```

## 変数宣言
``` perl
use strict;
use warnings;
use utf8;

# 「use strict」を使用している場合、変数宣言時に"my"がないとエラー

# 変数名に「$」がつくとスカラー（通常の変数）
my $scalar = "サンプル";
print $scalar;

# 変数名に「@」がつくと配列
my @array= (1, 2, 3);
# 配列要素を操作する時は「$」を使用
$array[3] = 4;
print $array[3];

# 変数名に「%」がつくとハッシュ（連想配列）
my %hash = (
"Sano" => "Yuriko",
"Hinata" => "Haruna");
# ハッシュ要素を操作する時は「$」を使用
$hash{"Sakura"} = "Miki";
print $hash{"Sano"};
```

実行結果
```
サンプル4Yuriko
```

## 文字列
``` perl
use strict;
use warnings;
use utf8;

my $str1 = "yuri";
my $str2 = "ko";
my $str3 = "pon";

# 文字列連結は「.」を使用
my $str4 = $str1.$str2;
my $str5 = "haru".$str2;
my $str6 = $str3."ko";

# 「print」だけでは改行しないため「\n」で改行
print $str4."\n";
print $str5."\n".$str6;

# 「"」の文字列内に変数名を記載するとその変数値が文字列に結合される
print "\n$str4";

print "\n";

# 「'」の文字列内に変数名を記載しても変数としては認識されない
print '$str5';

# 「'」の文字列内では特殊文字も適応されない
print '\n';

print "\n";

# 「"」の文字列と「'」の文字列は連結可能であり、各文字列での動作が再現され結合される
print "$str5\n".'\n$str6';

print "\n";

# 変数を出力する際は「${変数名($より先)}」を使用するのが基本
print "${str6}\n";

# 数値でも文字列連結や出力が可能
my $num1 = 10;
my $num2 = 20;
my $num3 = 30;

print $str4.$num1."\n";
print "haruko${num2}\n";
print "${str6}${num3}";
print $num1.$num2;
```


実行結果
```
yuriko
haruko
ponko
yuriko
$str5\n
haruko
\n$str6
ponko
yuriko10
haruko20
ponko301020
```

## 条件分岐
``` perl 
use strict;
use warnings;
use utf8;

my $num1 = 40;
if($num1 >= 10){
    print "10以上";
}else{
    print "10未満";
}

print "\n";

my $num2 = 50;
# 「else if」には「elsif」を使用
if($num1 == 200 && $num2 == 100){
    print "AND";
}elsif($num1 < 200 || $num2 > 100){
    print "OR";
}

print "\n";

# 条件に一致しない時に実行される「unless」というものがある
unless($num1 == 0){
    print "条件に一致しない\n";
}

# 「if」「unless」を行末に条件付きで記述すると、その行の処理が実行されるかどうか制御できる
print $num1."\n" if $num1 == 40;
print $num2."\n" unless $num2 == 40;

# 明示的なboolean型は存在せず、条件式の結果はtrueなら1、falseなら空として扱われる
my $bool1 = $num1 == 40;
my $bool2 = $num2 == 40;

print "[result:${bool1}]\n";
print "[result:${bool2}]";
```

実行結果
```
Wide character in print at if.pl line 7.
10以上
OR
Wide character in print at if.pl line 26.
条件に一致しない
40
50
[result:1]
[result:]
```
※日本語を出力される場所には、
　「Wide character in print at ファイル名 line 実行された行.」
　が出力される

## for
``` perl
use strict;
use warnings;
use utf8;

for(my $i = 0; $i < 10; $i++){
    print "${i}\n";
}

my $isRedo;
for(my $i = 0; $i < 10; $i++){
    if($i < 3){
        # javaでいう「continue」
        next;
    }
    print "${i}\n";

    if(!$isRedo && $i == 6){
        $isRedo = 1;
        # redoで同一の値で繰り返し処理の最初から再度実行される
        redo;
    }

    if($i == 8){
        # javaでいう「break」
        last;
    }
}
```

実行結果
```
0
1
2
3
4
5
6
7
8
9
3
4
5
6
6
7
8
```

## foreach
``` perl
use strict;
use warnings;
use utf8;

my @nums = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
foreach my $num(@nums){
    print "$num\n";
}

# forでも可能
for my $num(@nums){
    print "$num\n";
}

# ハッシュのforeach
my %member = (
    "Aoyama" => "Reina",
    "Niibo" => "Kishiro",
    "Yano" => "Miyuu");
# keyが入る変数名を指定して「keys(ハッシュ名)」でforeachを形成
for my $key(keys(%member)){
    # keyを使用してハッシュから値を取り出す
    print "${key}${member{$key}}\n"
}
```

実行結果
```
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
AoyamaReina
YanoMiyuu
NiiboKishiro
```

## while・until
``` perl
use strict;
use warnings;
use utf8;

my $i = 0;
while($i < 10){
    print "${i}\n";
    $i++;
}

# 「until」は条件を満たしていないときに繰り返される
my $j = 0;
until($j >= 10){
   print "${j}\n";
   $j++; 
}
```

実行結果
```
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
```

## forにlabelを設定
``` perl
use strict;
use warnings;
use utf8;

FOR1: for(my $i = 0; $i < 10; $i++){
    print "i:${i}\n";
    FOR2: for(my $j = 0; $j < 10; $j++){
        print "j:$j\n";
        if($j == 5){
            # 外側のfor文「FOR1」に対して実行される
            next FOR1;
        }
    }
}
```

実行結果
```
i:0
j:0
j:1
j:2
j:3
j:4
j:5
i:1
j:0
j:1
j:2
j:3
j:4
j:5
i:2
j:0
j:1
j:2
j:3
j:4
j:5
i:3
j:0
j:1
j:2
j:3
j:4
j:5
i:4
j:0
j:1
j:2
j:3
j:4
j:5
i:5
j:0
j:1
j:2
j:3
j:4
j:5
i:6
j:0
j:1
j:2
j:3
j:4
j:5
i:7
j:0
j:1
j:2
j:3
j:4
j:5
i:8
j:0
j:1
j:2
j:3
j:4
j:5
i:9
j:0
j:1
j:2
j:3
j:4
j:5
```

## サブルーチン
``` perl
use strict;
use warnings;
use utf8;

# 先頭に「sub」とつけるとサブルーチン(メソッド)になる
sub func1{
    return "OtaRiona\n";
}

# 引数名指定なしサブルーチン1
sub func2{
    # 引数名指定がない場合、「$_[第n引数]」で取得可能
    my $num1 = $_[0];
    my $num2 = $_[1];

    # 「return」がなくとも最後に記述されている変数や文字列、計算結果が戻り値になる
    $num1 + $num2;
}

# 引数名指定なしサブルーチン2
sub func3{
     # 引数は配列「@_」で渡される
    for my $name(@_){
        print $name;
    }
}

# 引数名指定ありサブルーチン
sub func4{
    # 引数は@_の配列で渡されてくる
    my ($lastNm, $firstNm) = @_;
    return $lastNm.$firstNm."\n";
}

# 「& + サブルーチン名」で呼び出し
print &func1;
# 引数の指定は()を使用
print &func2(1, 2);
print "\n";
print &func3("Sena", "Momoka");
print "\n";
print &func4("Maeda", "Misakai");
```

実行結果
```
OtaRiona
3
SenaMomoka
MaedaMisakai
```