Perl

13.9 サブクラスのインスタンスを判定する

あるオブジェクトが特定のクラスまたはそのサブクラスのインスタンスであるかどうかを判定する。 UNIVERSALと言う特別なクラスに含まれているメソッドを次のような方法で使用する。 $obj->isa("HTTP::Message"); # オブジェクトメソッドとして HTTP::Respons…

13.8 メソッドを間接的に呼び出す

実行時にならないと判明しない名前を使用して、メソッドを呼び出す。 メソッド名を文字列として、スカラ変数に保存し、実際のメソッド名を矢印演算子の右側に使用するときに、その変数を使用する。 $methname = "flicker"; $obj->$methname(10); # $obj->fli…

13.6 クローンを作成するコンストラクタ

既存のオブジェクト上で呼び出されるコンストラクタメソッドを作成する必要がある。ただし、このコンストラクタメソッドが呼び出された場合には、新しいオブジェクトを初期化するためのデフォルト値として、元のオブジェクトの値を使用しなければならない。 …

13.7 コピーコンストラクタ

自分が作成したクラスのユーザにコピーメソッドを提供したい。または、クラスによってコピーメソッドが提供されていないオブジェクトをコピーしたい。 標準モジュールのStorableに含まれているdclone()関数を使用する。 use Storable qw(dclone); use Carp; …

13.5 構造体としてのクラスの使用方法

標準モジュールのClass::Structのstructを使用して、Cプログラミング言語の構造体に類似したデータ構造を宣言する。 use Class::Struct; # 構造体専用のモジュールをロードする struct Person => { # "Person"の定義を行う name => '$', # nameフィールドは…

13.4 クラスデータを管理する

1個のオブジェクトだけでなく、クラス全体においてメソッドが呼び出されるようにする必要がある。 クラスの名前を含む文字列を指定して、クラスメソッドを呼び出す。 package Person; $Body_Count = 0; sub population { return $Body_Count } sub new { $Bo…

13.3 インスタンスデータを管理する

オブジェクトハッシュの適切なキーにアクセスして、その値を取得および設定するメソッドを作成する。 sub get_name { my $self = shift; return $sef->{NAME}; } sub set_name { my $self = shift; $self->{NAME} = shift; } 引数を渡されたかどうかに応じて…

13.2 オブジェクトを破棄する

オブジェクトが不要になったら、その度に特別なコードを実行する。 DESTROYと言うメソッドを使う。オブジェクトの参照が切れたとき、プログラムが終了するときに呼び出される。 sub DESTROY { my $self = shift; printf("$self dying at %s\n", scalar local…

13.1 オブジェクトを作成する

単純なコンストラクタ sub new { my $class = shift; my $self = {}; bless($self, $class); return $self; } 初期化とメモリ割当/blessを分離する方法 sub new { my $class = shift; # 作成するオブジェクトのクラス名を取得する my $self = {}; # 新しいメ…

12.23 プログラム: インストール済みのモジュールのバージョンと説明を検索する

CPANPLUSモジュールを使用する方法 use CPANPLUS::Backend; use Data::Dumper; $cp = CPANPLUS::Backend->new; $installed = $cp->installed->rv; # インストール済みのモジュールの一覧を取得する。 foreach my $module (sort keys %$installed) { # モジュ…

12.22 例: モジュールのテンプレート

package Some::Module; # Some/Module.pmに保存する use strict; require Exporter; # バージョンチェック用にバージョンを設定する。 our $VERSION = 0.01; our @ISA = qw(Exporter); our @EXPORT = qw(&func1 &func2 &func4); our %EXPORT_TAGS = (); # 例…

12.20 PODでドキュメントを作成する

12.21 CPANモジュールのビルドとインストール

モジュールをダウンロードしてインストール % gunzip Some-Module-4.54.tar.gz % tar xf Some-Module-4.54.tar % cd Some-Module-4.54 % perl Makefile.PL PREFIX= % make % make test % make install モジュールを直接インストール % perl -MCPAN -e "insta…

12.19 Inline::CでCの拡張モジュールを書く

Perlから呼び出すことができる関数をCで書きたい。 CPANで入手できるInline::Cモジュールを使用する use Inline::C; $answer = somefunc(20, 4); print "$answer\n"; __END__ __C__ double somefunc(int a, int b) { /* Inlineは基本的なCの型の大半を認識す…

12.17 h2phでCの#includeファイルを変換する

% cd /usr/include; h2ph *.h */*.h

12.18 h2xsでCコードを含むモジュールを作成する

使用しているシステムに固有のC関数にPerlからアクセスしたい。 h2xsツールを使用する % perl Makefile.PL % make

12.15 警告をカスタマイズする

自分のモジュールにおいてレキシカルな警告に関する呼び出し側の設定を重視してそれに対応する処理を行いたいが、それらの設定を確認しようと思っても、前もって定義されている$^W変数の値を検査することができない。 use warnings::register;

12.16 パッケージを間接的に参照する

実行時にならないと名前のわからないパッケージに含まれている変数や関数を参照する必要がある。ただし、$packname::$varnameのような構文は不正である。 シンボリックリファレンスを使用する。 { no strict "refs"; $val = ${ $packname . "::" . $varname …

12.13 全てのパッケージの組み込み関数をオーバーライドする

現在のパッケージだけでなく、自分のプログラム全体に含まれている主要な組み込み関数の定義を変更する必要がある。 シンボルテーブルを直接操作することによって、CORE::GLOBALと言う疑似パッケージに関数を手動でインポートする。 *CORE::GLOBAL::int = \&…

12.14 組み込み関数と同様のエラーと警告を出力する

自分のモジュールでエラーと警告を生成する。しかし、warnまたはdieを使用すると、自分自身のモジュールのファイル名と行番号が出力される。ユーザのコードに基づいてメッセージが出力されるようにしたい。 標準モジュールCarpを使用する。 warn -> carp die…

12.12 組み込み関数をオーバーライドする

標準的な組み込み関数を独自のバージョンに置き換えたい。 該当する関数を別のモジュールから自分自身の名前空間にインポートする。 関数の定義 package Time::HiRes; use strict; require Exporter; use vars qw(@ISA, @EXPORT_OK); @ISA = qw(Exporter); @…

12.11 Autoloaderでモジュールのロードを高速化する

h2xsツールを使用して、必要なディレクトリと全てのファイルを作成する。 % h2xs -Xn Sample % cd Sample % perl Makefile.PL LIB=~/perllib % (Sample.pmを編集する。) % make install

12.9 モジュールを配布する

h2xsツールを使用する。 % h2xs -XA -n Planets % h2xs -XA -n Astonomy::Orbits

12.10 SelfLoaderでモジュールのロードを高速化する

SelfLoaderモジュールを使用する require Exporter; require SelfLoader; @ISA = qw(Exporter SelfLoader); # # 他の初期化または宣言をここに書く # __DATA__ sub abc { .... } sub def { .... }

12.8 自分専用のモジュールディレクトリを用意する

Perlの-lコマンドラインスイッチを使う。 PERL5LIB環境変数を設定する。 use libプラグマを使用する。 use FIndBin qw($BIN); use lib "$BIN/../lib";

12.6 呼び出し側のパッケージを判定する

現在のパッケージを判定する。 $this_pack = __PACKAGE__; 呼び出し側のパッケージを判定する。 $that_pack = caller();

12.7 モジュールのクリーンアップを自動化する

ユーザによる操作を必要とせずに自動的に呼び出されるモジュールの設定コードとクリーンアップコードを作成する必要がある。 設定コードについては、モジュールファイル内のサブルーチン定義以外の場所に実行可能なステートメントを書く。 クリーンアップコ…

12.4 変数を局所化する

パッケージ内で有効なレキシカル変数を使用する。

12.5 関数を局所化する

関数をパッケージに対して、局所化することはできない。 局所変数を作成し、その変数に無名関数へのリファレンスを保存する。 # これは、SomeModule.pmと言うファイルである package SomeModule; my $secret_function = sub { # ここにコードを書く }; sub r…

12.3 useで処理を実行時まで遅延させる

プログラムを実行するときに、必要な場合に限ってロードするモジュールがある。あるいは、プログラムが起動された後でロードすることが必要なモジュールがある。 useによる処理をrequireとimportによる独立した2つの処理の分割するか、または、use autouseプ…