2019年5月15日水曜日

[Perl] 07. サブルーチン

サブルーチン(関数)の作り方に関するメモ。サブルーチン名を sub_*** としているのは私の趣味。



サブルーチンの定義
sub を使ってサブルーチンの定義する。戻り値がある場合は return 文を使う。

sub <サブルーチン名> {
<処理>
return <戻り値>;
}

サブルーチンを呼び出すときは &<サブルーチン名>(); とする。
&, () は省略可能だが、サブルーチンの定義が呼び出し位置よりも下にある場合、& もしくは () が無いとサブルーチンとして認識されない。& を付けると、自作サブルーチンと同名の組み込み関数があった場合に自作サブルーチンが優先される。
# 戻り値なし
sub sub_test1 {
    print "Hello World\n";
}

# 戻り値あり
sub sub_test2 {
    return "Hello World Return";
}

&sub_test1();
sub_test1;     # &, () 省略

$str = sub_test2;
print $str."\n";
実行結果
Hello World
Hello World
Hello World Return
私は関数を上にまとめる習慣があるので上に書いてしまいますが、Perl は下にまとめるのが一般的みたいですよ。

サブルーチンの引数
呼び出し側は、サブルーチン名の後ろに () を付け、その中に引数を順に指定する。
サブルーチンが受け取った引数は、特殊変数 @_ に格納される。個別に参照したい場合は $_[0], $_[1], ... とする。
sub sub_test {
    print "@_"."\n";
    print "$_[0]"."\n";
    print "$_[1]"."\n";
}

&sub_test("Hello", "World");
実行結果
Hello World
Hello
World

サブルーチン内で使用する @_ や $_[0] はリファレンスとなっているので、@_ や $_[0] を変更すると、引数として指定された変数の値も変更される。
sub sub_test {
    $_[0] = "AAA";
    $_[1] = "BBB";
}

@array = ("Hello", "World");

print "@array"."\n";

&sub_test(@array);

print "@array"."\n";
実行結果
Hello World
AAA BBB

引数の値を変更する処理を行う場合は、一旦別の変数にコピーしてから使用すること。
sub sub_test {
    my $arg1 = $_[0];
    my $arg2 = $_[1];
    $arg1 = "AAA";
    $arg2 = "BBB";
    ...
}

@array = ("Hello", "World");

print "@array"."\n";

&sub_test(@array);

print "@array"."\n";
実行結果
Hello World
Hello World

サブルーチンにファイルハンドルを渡す
サブルーチンにファイルハンドルを渡す場合のサンプル。引数指定時に *<ファイルハンドル名> とする。
sub sub_test6 {
    my $file_in  = $_[0];
    my $file_out = $_[1];

    while ($line = <$file_in>) {
        print $file_out "$line";
    }
}

open (FH1, "< ./file1.txt");
open (FH2, "> ./file2.txt");

&sub_test6 (*FH1, *FH2);


0 件のコメント:

コメントを投稿