Corredor

ウェブ、プログラミングの勉強メモ。

Perl 再入門 : サブルーチンの基礎まとめ

Perl における関数は、サブルーチンと表現され、sub で宣言する。今回はこのサブルーチンに関しての仕様を押さえておく。

Perl におけるサブルーチンの引数の処理

  • 引数が1つの場合
    • 配列を単独の変数に格納しようとすると、配列の要素数が代入されてしまうため、要素が1つの配列に代入するように書く
sub mySub {
  my ($name) = @_;
}
  • 引数が複数の場合
    • @_ を各変数に展開させれば良い
sub mySub {
  my ($name, $age, $address) = @_;
}

要するに引数の数に関わらず my ($arg) = @_; と書くのが良さそうだ。

そういや、Perl は return 文を省略できる。最後の計算結果や文字列を戻り値として認識するのだ。

サブルーチンの入れ子はできる?

以下の文献によると、あるサブルーチンの内部にあるサブルーチンが、別のサブルーチンから呼べてしまうようで、サブルーチンを入れ子にすることでスコープを作ることはできないようだ。

sub hoge {
  sub fuga {
    print "fuga";
  }
  
  print "hoge";
}

# hoge() 内の fuga() が呼べてしまう
sub another {
  fuga();
}

コレだと入れ子にする必要もない、というか、入れ子にすることで実現したい、サブルーチンのスコープが作れなくなる。

そんな時は、代わりに local *inner = sub {} と書くのが良い。

sub hoge {
  print "hoge";
  
  # ローカルなサブルーチンを宣言する
  local *fuga = sub {
    print "fuga";
  };
  
  fuga();
}

sub foo {
  fuga();  # 構文エラーにはならないが何も起こらない (上述のサブルーチンは呼べない)
}

hoge();  # 内部の fuga() も実行され、「hoge fuga」と出力される

fuga();  # 何も起こらない
foo();   # 結果、何も起こらない

こんな感じ。

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl