Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

サブルーチンをサブルーチン内で宣言して

呼び出すとどうなるのか。
急に気になったのでやってみた。

#!/usr/local/bin/perl
# nest_sub1.pl
use strict;
use warnings;
use 5.010;

sub a_nest(_) {
  say;
  sub b_nest(_) {
    say;
  }
  b_nest;
}

a_nest for 1 .. 5;
say '----------------';
b_nest for 6 .. 10;

__END__
$ ./nest_sub1.pl
1
1
2
2
3
3
4
4
5
5
----------------
6
7
8
9
10

6〜10が出たということは、a_nest()が呼ばれてる度にb_nest()が作られているというわけではなさそう。


じゃあb_nest()の中でa_nest()って呼べるのか?

#!/usr/local/bin/perl
# nest_sub2.pl
use strict;
use warnings;
use 5.010;

sub a_nest(_) {
  say;
  sub b_nest(_) {
    say;
    a_nest();
  }
}

a_nest for 1 .. 5;
say '----------------';
b_nest for 6 .. 10;

__END__
$ ./nest_sub2.pl
1
2
3
4
5
----------------
6
6
7
7
8
8
9
9
10
10

呼べた。



じゃあa_nest()の中でa_nest()って呼べるのか?

#!/usr/local/bin/perl
# nest_sub3.pl
use strict;
use warnings;
use 5.010;

sub a_nest(_) {
  say;
  sub b_nest(_) {
    say;
  }
  a_nest();
}

a_nest for 1 .. 5;
say '----------------';
b_nest for 6 .. 10;

__END__
$ ./nest_sub3.pl
1
1
1
1
1
1
1
…………
1
^C

呼べた、が、無限ループこわい。ひふみよひふみよ。



まあ普通はこんな使い方しないわな。
でもサブルーチン内でサブルーチン作ってるのは見たことあるなあ。
メリットあるのかな。
外からでも呼べるのに。