Exporter::@EXPORT

Exporterの@EXPORTにどんどん公開メソッドを追加していけば、どんどん見える。
逆に、追加しないメソッドは非公開メソッドになる・・・かというとそういうわけではないというか・・・。

Exporter - 関数をエクスポートする - Perl入門ゼミ

CustomModule.pmで、

public_method_2を@EXPORTに追加して、private_methodは追加しない。
public_method_2の中で、private_methodを呼ぶことはする。

#!/usr/bin/perl

# CustomModuleをuseで読み込む.
use CustomModule;

# CustomModuleの公開メソッドを呼ぶ.
public_method_1(); # public_method_1を呼ぶ.

# CustomModuleの非公開メソッドは直接呼べない.
private_method(); # private_methodは見えない.

このように直接呼ぶ事は、

$ vi Exporter.pl
$ perl Exporter.pl
This is BEGIN.
public_method_1.
Undefined subroutine &main::private_method called at Exporter.pl line 10.
$

出来ない。
しかし、

#!/usr/bin/perl

# CustomModuleをuseで読み込む.
use CustomModule;

# CustomModuleの公開メソッドを呼ぶ.
public_method_1(); # public_method_1を呼ぶ.

# CustomModuleの非公開メソッドは直接呼べない.
#private_method(); # private_methodは見えない.
CustomModule::private_method(); # パッケージ名を付けると呼べる.

パッケージ名を付けた場合は、

$ vi Exporter.pl
$ perl Exporter.pl
This is BEGIN.
public_method_1.
private_method.
$

呼べてしまう。

public_method_2経由で呼び出した方が、

$ vi Exporter.pl
$ perl Exporter.pl
This is BEGIN.
public_method_1.
private_method.
public_method_2.
private_method.
$

お行儀良いのだけれど。

Sample/perl/Exporter/EXPORT/src/Exporter at master · bg1bgst333/Sample · GitHub

Exporter

Exporterモジュールを使うと、モジュールからメソッドを呼び出す時に、パッケージ名を付けたりするのが不要になる。
モジュールにimportの実装も不要。

Exporter - 関数をエクスポートする - Perl入門ゼミ

CustomModule.pmは、

public_method_1を定義して、@EXPORTにそれを追加することで、このメソッドが公開される。

#!/usr/bin/perl

# CustomModuleをuseで読み込む.
use CustomModule;

これだけだと、

$ vi Exporter.pl
$ perl Exporter.pl
This is BEGIN.
$

"This is BEGIN."だけ。

public_method_1というメソッド名を書くだけで、

$ vi Exporter.pl
$ perl Exporter.pl
This is BEGIN.
public_method_1.
$

このように呼び出せる。
@ISAとか、あの辺が無いと呼び出せない模様。いずれ扱う。

Sample/perl/Exporter/Exporter/src/Exporter at master · bg1bgst333/Sample · GitHub

main

パッケージ名を宣言していない場合、そこの変数や関数はmainパッケージに含まれる。

package - パッケージの宣言 - Perl入門ゼミ

最初のprintは組み込み関数printとして呼ばれる。
その後、printを定義していて、パッケージ名がこのファイルには宣言されていないので、このprintはmainパッケージに含まれることになる。
main::printとした場合は、mainパッケージのprintが呼ばれるので、上で宣言したprintが呼ばれる。
その後で、ただprintと呼んだ場合は、組み込み関数のprintが呼ばれる。

$ vi main.pl
$ perl main.pl
ABC
DEF
JKL
$

main::printの場合、定義したprintの"DEF"が出力され、渡した"GHI"は使われない。
その後のprintは定義が上書きされるのかと思いきや、組み込み関数がそのまま呼ばれる模様。

Sample/perl/main/main/src/main at master · bg1bgst333/Sample · GitHub

@INC

モジュールの検索パスのリストは、配列@INCに格納されている。
useやrequireでモジュールを読み込む時、このリストのそれぞれのパスからモジュールを探索している。

モジュールの検索パス @INC - Perl入門ゼミ

配列なのでforeachで取り出す。

実行すると、

$ vi INC.pl
$ perl INC.pl
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
.
$

このように、モジュールの検索パスのリストが出る。

Sample/perl/INC/INC/src/INC at master · bg1bgst333/Sample · GitHub

CWindow::StaticWindowProc

ウィンドウプロシージャをメンバにするには、staticにする。

このように。
そして、Window.cppは、

こうして、

RegisterClassの時も、StaticWindowProcを指定。

変わらず表示できた
変わらず表示できた

変わらず表示できた。
そして、CApplicationや、CWindowも含めて、ここまでのクラス化を、


【B.G Live】CWindow::StaticWindowProc【Test/winapi】

またもや、配信した。

Test/winapi/CWindow/StaticWindowProc/src/CWindow at master · bg1bgst333/Test · GitHub

import

requireはimportを実行しない、useはimportを実行する。
importは、なんのことはない、ただモジュールに定義された関数である。

Perlの組み込み関数 import の翻訳 - perldoc.jp
独自のimport関数を定義する話 - Qiita
perl のモジュールインポートまわりの整理 - Please Sleep

CustomModule.pmは、

とする。

import.plで、

#!/usr/bin/perl

# CustomModuleをrequireで読み込む.
require CustomModule; # importは実行されない.

requireをした場合は、

$ vi CustomModule.pm
$ vi import.pl
$ perl import.pl
This is BEGIN.
$

BEGINだけ実行される。

useの場合は、

$ vi import.pl
$ perl import.pl
This is BEGIN.
This is import.
$

importも実行される。

Sample/perl/import/import/src/import at master · bg1bgst333/Sample · GitHub