小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

パッケージサブルーチンとbless

えーと実は、サブルーチンは必ずどこかのパッケージに属しています。
そう、パッケージ宣言しないと自動的にmainパッケージになるのです。


そして、サブルーチンのコールには、以下の4通りがあるのです(他にもあるかも)。

  1. パッケージデリミタを使ってサブルーチンコール
  2. 矢印演算子を使ってサブルーチンコール
  3. blessを使ってサブルーチンコール
  4. 無名サブルーチンリファレンスを使ってサブルーチンコール

◆サンプル(bless.pl)

use strict;
use warnings;

    # 1.パッケージ名からパッケージデリミタを使ってサブルーチンコール
    main::test(10);
    package01::test(10);
    package01::test2(100);

    # 2.パッケージ名から矢印演算子を使ってサブルーチンコール
    main->test(20);
    package01->test(20);
    package01->test2(200);

    # 3.blessを使ってサブルーチンコール
    my $test;
    $test = bless \$test, 'main'; 
    $test->test(30);
    $test = bless \$test, 'package01'; 
    $test->test(30);
    $test->test2(300);

    # 4. 無名サブルーチンリファレンスを使ってサブルーチンコール
    $test = sub {print "無名サブルーチンで引数は-->@_<--です。", "\n"; };
    $test->(40);
    sub {print "無名サブルーチン2で引数は-->@_<--です。", "\n"; }->(400); # 即実行

sub test {
    print "mainパッケージのサブルーチンで引数は-->@_<--です。", "\n";
}

package package01;
sub test {
    print "package01パッケージのサブルーチンで引数は-->@_<--です。", "\n";
}
sub test2 {
    print "package01パッケージのサブルーチン2で引数は-->@_<--です。", "\n";
}

◆実行結果

C:\samp_pl>perl bless.pl
mainパッケージのサブルーチンで引数は-->10<--です。
package01パッケージのサブルーチンで引数は-->10<--です。
package01パッケージのサブルーチン2で引数は-->100<--です。
mainパッケージのサブルーチンで引数は-->main 20<--です。
package01パッケージのサブルーチンで引数は-->package01 20<--です。
package01パッケージのサブルーチン2で引数は-->package01 200<--です。
mainパッケージのサブルーチンで引数は-->main=REF(0x1ac65d0) 30<--です。
package01パッケージのサブルーチンで引数は-->package01=REF(0x1ac65d0) 30<--です。
package01パッケージのサブルーチン2で引数は-->package01=REF(0x1ac65d0) 300<--です。
無名サブルーチンで引数は-->40<--です。
無名サブルーチン2で引数は-->400<--です。

◆補足

1は、ごく普通のサブルーチンコールです。まぁ、メインパッケージの時は修飾しないけど・・・。
2は、第一引数が自動的にパッケージ名(クラス名)になります。
3は、第一引数が自動的に変数のリファレンス(オブジェクト)になります。
4は、ごく普通の無名サブルーチンコールです。


補足の通り、微妙に違いがあるのだけれど、なんで4通りも必要なのか・・・それは・・・
実は、パッケージは一種のクラスで、何かのリファレンスをblessしてクラスと紐付けるとオブジェクトになるのです。
つまり、Perlでのオブジェクト指向の布石なのですね・・・これが。