コンストラクタでのPerlメソッド使用法入門
Perlのメソッド
I. Perl メソッド入門
Perlのメソッド定義には特別な構文はありませんが、Perlのメソッドの第1引数はオブジェクトまたはそれが参照されるパッケージであることが指定されています。
静的なPerlメソッドの第1引数はクラス名、ダミーのPerlメソッドの第1引数はオブジェクトへの参照です。Perlメソッドが第1引数をどう扱うかによって、それが静的かダミーかを決定しています。静的なPerlメソッドは、どのクラスかすでに分かっているので、一般に第1引数を無視し、コンストラクタが静的なPerlメソッドとなります。ダミーPerlメソッドは通常、まず第1引数を変数 self または this にシフトし、その値を通常の参照として使用します。たとえば
subnameLister{
my$this=shift;
my($keys,$value);
while(($key,$value)=each(%$this)){
print"\t$keyis$value.\n";
}
}
II. Perl メソッドの出力
今、Cocoa.pm パッケージを参照しようとすると、Perl メソッドが見つからないというコンパイルエラーが出ます。Cocoa.pm の Perl メソッドはまだエクスポートされていないのですから、Perl メソッドが見つからないのは当然です。Perl メソッドをエクスポートするには Exporter モジュールが必要で、これはパッケージの先頭に次の2行を追加します。
requireExporterを使用します。
ISA=qw(Exporter)です。
この2行は Exporter.pm モジュールをインクルードし、Exporter クラス名を検索用に @ISA 配列に追加しています。次に、@EXPORT 配列に自分のクラスの Perl メソッドを列挙するだけです。例えば、PerlのメソッドcloseMainとdeclareMainをエクスポートしたい場合、以下のような記述になります。
EXPORT=qw(declareMain,closeMain)です。
Perlのクラスの継承は、@ISA配列で実装されています。ISA配列はどのパッケージでも定義する必要はありませんが、一度定義するとPerlはこれをディレクトリ名の特別な配列として扱います。これは@INC配列に似ていて、@INCは含むファイルへのシークパスです。ISA配列にはクラス(パッケージ)名が含まれており、Perlのメソッドが現在のパッケージで見つからない場合、@ISAにあるパッケージを探しに行きます。また、@ISAには現在のクラスが継承しているベースクラスの名前も含まれています。
あるクラスで呼び出されるすべてのPerlメソッドは、@ISA配列で定義された同じクラスまたはベースクラスに属している必要があります。Perl のメソッドが @ISA 配列で見つからない場合、Perl は AUTOLOAD() サブルーチン (現在のパッケージでは sub で定義されているオプションのサブルーチン) でメソッドを探します。AUTOLOADサブルーチンを使用する場合、useAutoload; ステートメントで autoload.pm パッケージを呼び出す必要があります。AUTOLOADサブルーチンは、呼び出されたPerlメソッドをインストール済みのPerlライブラリからロードしようと試みます。AUTOLOADも失敗すると、Perlは次にUNIVERSALクラスで最後の試みを行い、それでも失敗すると、Perlは解決不可能な関数に関するエラーを生成します。
III. Perlのメソッドを呼び出す
オブジェクトのPerlメソッドを呼び出すには、オブジェクトを参照する方法(virtual Perlメソッド)と、クラス名を直接使用する方法(static Perlメソッド)の2つがあります。もちろん、Perlメソッドはすでにエクスポートされている必要があります。
では、そのクラスのPerlメソッドを利用するための簡単なPerlスクリプトを書いてみましょう。以下は、Javaappletのソースコードのスケルトンを作成するスクリプトのコードです。
#! /usr/bin/perl
useCocoa;
$cup=newCocoa;
$cup->setImports('java.io.InputStream','java.net.*');
$cup->declareMain("Msg","java.applet.Applet","Runnable");
$cup->closeMain();
This script creates a Javaapplet called Msg, which extends the java.applet.Applet applet and makes it runnable, where the last three lines could also be written as follows.
Cocoa::setImports($cup,'java.io.InputStream','java.net.*');
Cocoa::declareMain($cup,"Msg","java.applet.Applet","Runnable");
Cocoa::closeMain($cup);
The result of its operation is as follows.
/*
**CreatedbyCocoa.pm
**Useatownrisk
*/
importjava.io.InputStream;
importjava.net.*;
publicclassMsgextendsjava.applet.AppletimplementsRunnable{
}
注意:Perlのメソッドを->演算子で呼び出す場合(間接呼び出しともいう)、引数は括弧で囲む必要があり、例えば、$cup-> setImports('java.io.InputStream','java.net.*'); などダブルコロンコールで呼び出すことができます。Cocoa::setImports($cup InputStream','java.net.*'); のように、括弧を付けずに書くことも可能です。Cocoa::setImports$cup,'java.io.InputStream','java.net.*' のように括弧を付けずに書くこともできます。
IV. オーバーロード
異なる2つのクラスが同じ名前のPerlメソッドを持っている場合など、あるクラスのどのPerlメソッドを使うかを指定する必要がある場合があります。クラスEspressoとQavaがともにPerlメソッドgrindを定義していると仮定すると、QavaのPerlメソッドを使用するように::演算子で指定することができます。
$mess=Qava::grind("whole","lotta","bags") とします。
Qava::grind($mess,"whole","lotta","bags") を実行します。
プログラムの実行状況に応じて、クラスのどのPerlメソッドを使用するかを選択することが可能で、これは呼び出しにシンボリックリファレンスを使用することによって行うことができます。
$method=$local?"Qava::":"Espresso::";
$cup->{$method}grind(@args)です。
関連
-
ファイルが存在するかどうかを判断するasp関数
-
JSONデータを扱うASP実装コード
-
aspで文字列を数値に変換する関数のまとめ
-
asp createTextFileはutf8をサポートしたテキストファイルを生成します。
-
ASP Baidu アクティブプッシュのコード例
-
Perlの単一行コメントと複数行コメントの紹介
-
スペースがセパレータである場合の perl qw 問題の解決法
-
perl で書かれた乱数話法プログラム (rand random function)
-
perl変数$/の使用方法について説明します。コンテキストが行モードのとき、$/は行を区別するものを定義します。
-
perlの尖ったブラケット演算子(<>)について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
プロセス分析によるhttpsリクエストのチャールズベースクローリング
-
ASP RecordSet OpenとConnection.Executeのいくつかの違いと共有すべき詳細な内容
-
aspで仮想ディレクトリのルートパスを取得するコード
-
aspとphpの時限式ページ生成のためのアイデアとコード
-
数字を漢数字(大文字の金額)に変換するASP機能
-
aspのドメインアクセス制限コード
-
perl スクリプティング スタディガイド - 読書メモ
-
Perlによるディレクトリの探索とLinuxコマンドによるログの解析 コード例共有
-
perlのsrand()とtime関数の使い方の紹介
-
重複するコンテンツ(重複する行+重複するフィールドの配列)を削除するための perl スクリプトコード