1. ホーム
  2. スクリプト・コラム
  3. パール
  4. アプリケーションのヒント

コンストラクタでのPerlメソッド使用法入門

2022-02-02 14:34:21
Perl言語におけるPerlメソッドの概念は理解できましたか?ここで、簡単にご紹介します。PerlクラスのPerlメソッドは、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)です。