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

CWindow

ウィンドウクラスの登録、ウィンドウの作成、ウィンドウの表示については、CWindowクラスにまとめる。
(MFCでいうところのCWndに相当する。)
ウィンドウプロシージャは、Window.h/Window.cppに移動するものの、今回はメンバにしない。
Window.hは、

メンバ変数にウィンドウハンドルm_hWnd、ウィンドウクラスの登録RegisterClass(これはstatic)、ウィンドウの作成Create、ウィンドウの表示ShowWindowをメンバとし、WindowProcはメンバにはしないがApplication.h/Application.cppからこちらに移動。
Window.cppは、

コンストラクタ、デストラクタ、それぞれのメンバ関数で、役割をその処理に専念させている。
特にRegisterClassは、ウィンドウクラス名を指定するだけで、あとは自動で設定する。
これにともない、Application.hは、

CWindowオブジェクトのm_mainWndをメンバ変数に追加。
Application.cppは、

InitInstanceがこんなにすっきり。

表示は変わらずできる
表示は変わらずできる

表示は変わらずできる。

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