prevcontentnext


Perlの紹介

この章はPerlになじみのないユーザー、経験豊かなプログラマではないユーザーへのPerlの簡単な紹介です。Perlのプログラムの書き方はお教えできませんが、Perlの実用性や力を少し紹介しようと思います。

 

はじめに

 

Perl-FuはGimp1.0.x配布の中心部分ではありません。しかし、次期バージョンのGimp(1.2)は標準でGimpの一部としてPerl-Fuを含むでしょう。Gimp 1.0.xを使っているからといって嘆くことはありません。Perl-FuはGimp 1.0.xのプラグインとして利用できるし、Perl-Fuは開発バージョンのGimpにも含まれています。

Perl-FuはSchemeを基にGimpスクリプトを書くことができるScript-Fuプラグインのように、PerlでGimpのスクリプトを書くことができるプラグインです。そうです。Perl-FuとScript-Fuは両方ともプラグインです。

私達の意見では、PerlはSchemeよりもかなり簡単で使いやすいです。しかも、Schemeがベースのスクリプトと較べると、利用できるPerlスクリプトは大変豊富にあります。経験豊かなPerlプログラマもたくさんいます。(特殊なGimpスクリプトについて述べているのではなく、スクリプト一般について述べていることに注意。)

PerlはCGIスクリプトで使われているメジャーなスクリプト言語でもあります。Unixのシェルスクリプトをちょっとでもかじっていれば、Perlを学ぶのは非常に簡単です。実際、Perlスクリプトはシェルスクリプトを書くよりもずっと簡単なことに気付くでしょう。シェルスクリプトでいつも実行しているawksedやその他の小物は、他のUNIXシェルスクリプトプログラムの助けを借りずにPerlでネイティブに動かすことができます。

Perl Gimpユーザーのためのチュートリアルは、Dov GrobgelbのPerlチュートリアルです。これはとても良いチュートリアルで、Perlに慣れていれば、たぶんすぐにPerl-Fuを使うことができるでしょう。しかし、チュートリアルは「初めてのPerl 」まではカバーしていません。それは大量のトピックなので、この本の範囲を超えてしまいます。しかし、私達は、Perlの集中特訓コースを用意しました。

どのくらい経験を積めば

全くのスクリプト初心者にとって、集中特訓コースは、Dovのチュートリアルを読んで理解する助けになるでしょう。集中特訓コースを読み終えたら、Perl-Fuが使ってみたい重要なものかどうかを決められます。もし、もっとPerl-Fuについて学びたいのであれば、私達が贈ることができる最良のアドバイスは、Perlの本を買いに行き、Perlプログラミングの基本を勉強する、ということです。例えば、シェルスクリプトに慣れていれば、集中特訓コースとDovのチュートリアルを読んだら、きっと(Perlのオンライン文書を参照しながら)Perl-Fuを使い始めることができるでしょう。Perl-FuマニュアルページはPerl-Fuプラグインの各コマンドをカバーしており、それらは付録のPerl-Fuマニュアルページにあります。これらのページはPerl-Fuを書くときの優れた情報源です。

はっきりさせましょう。Perl-Fuを使いたければPerlを理解する必要がありますが、Perlは非常に大規模な言語で、それを全部やる必要はありません。基本的なGimpのスクリプトを書くためには、たいていPerl-Fuの初歩を学ぶだけで十分です。もっと経験を積んだPerlプログラマになったら、さらに高度なPerlスクリプティングを学ぶことができます。この章では、Perl-Fuプラグインのインストールと設定方法を述べます。これはだいたい簡単な手順ですが、Perlがインストールされてなければ、ちょっと面倒かもしれません。

Perl-Fuのインストールと設定

 

色々なアクセサリをGimpにインストールすることについて書いた章を読んでいれば(描画用タブレットとGimpスキャンとスキャナ参照)、きっとPerl-Fuをインストールする方法について10ページ以上書いてあると期待していることでしょう。

さて、今回はその説明をしません。ここまで読んでくれば、これまでに十分な経験を積んでいるはずなので、多少のヒントが必要なだけです。プラグインのコンパイルにもコンパイルについての大量のヒントがあります。

ヒント

Perl-Fuに必要なPerl-FuプラグインとGtk Perl拡張の最新ソースコードを入手するのは良いアイデアです。Perl-FuとPerl Gtkモジュールをダウンロードする場所を探すならPerl-Fuをチェックして下さい。

まずはじめに、GimpとGtkライブラリがライブラリ検索パスにあることを確認して下さい。Linuxでは/etc/ld.so.confファイルによって管理されています。Solaris(と他のほとんどのUnix方言)はライブラリ検索パスを制御するためにLD_LIBRARY_PATH環境変数を使っています。

次に、(PATH環境変数で制御されている)パスにGimpとGtkのバイナリディレクトリを持っていなければなりません。Perl-FuとGtkのPerlモジュールの両方を準備するために使用するconfigureプログラムはgimp-toolgtk-configの検索に依存しています。

GimpやGtkを複数インストールしているなら、正しいディレクトリを最初に検索するためPATHLD_LIBRARY_PATHの両方を設定することが非常に重要です。

Gimp1.0.xとGtk 1.0.xが/opt/gimpの下にインストールされていて、Gimp1.1.xとGA1.2.xが/opt/gimp1.1の下にインストールされていて、Gimp1.1.xでPerl-Fuを有効にしたいのだと仮定しましよう。

その場合に設定しなければならないPATHは:

PATH=/opt/gimp1.1/bin:$PATH

それとLD_LIBRARY_PATHは:

LD_LIBRARY_PATH=/opt/gimp1.1/lib:$LD_LIBRARY_PATH

この方法で、Gimp1.1.xで使用するためのPerl-FuとGtkモジュールのコンパイルとインストールをすることがてきます。

環境変数を正しく設定しなければ、Perl-Fuのコンパイルとインストールが失敗するのは、たぶん確実です。もちろん、システムにPerlをインストールしていることも必要です。Perl 5.004_04かPerl 5.005のどちらか、もしくはそれ以上のバージョンが必要でしょう。

最後の助言は、Perl-FuとPerl GtkモジュールについてくるREADMEINSTALLを読む必要があるということです。読まなくてもどうにかなるというのは、思いあがってるか、(たいてい、こっちでないと思うが)関連する設定やコンパイルやインストールなどをしているUNIXとGimpとPerlの専門家であるかのどちらかです。

集中特訓コース

 

ここで基本的なPerlの関数を全てカバーすることはできませんが、DovのPerlチュートリアルをやる前に理解する必要のある、基礎的な関数を説明することにします。このセクションは本当の初心者向けのものです。だから、この集中特訓コースとDovのチュートリアルを読めば、他のPerlスクリプトも理解できるとは期待しないで下さい。

Perlスクリプトの定義

通常、プログラムを実行する時、プログラムファイルは0と1で構成されるバイナリファイルです。しかし、Perlはインタープリタ言語の一種であるため、Perlプログラムファイルは違っています。Perlは、0と1のバイナリファイルではなく、普通の人間が読むことができるテキストファイルを使用しています。

それゆえ、オペレーティングシステムがファイルを起動する時、Perlインタープリタを使わなければならないことをオペレーティングシステムに伝える必要があります(つまり、Perlの助けを借りてファイルを実行している)。これはファイルを「モード変更」することによって行います。

chmod 755 perl_fu_script.pl

そしてPerlファイルの一番上に特別の行を追加します。

#!/usr/local/bin/perl

この特別の行はファイルを実行するにはPerlを使わなければならないことをOSに伝えます。(当然、Perlの位置を指定する。この場合は/usr/bin/perlだった。)

あなたはたぶんシェルスクリプトを知ってるでしょう。シェルスクリプトは読むことのできるファイルを使います。Perlもそうです。シェルスクリプトの最初の行はこうです。

#!/bin/sh

(または、ほとんどのLinuxシステムは#!/bin/bash)

お分かりのように、幾つかのタイプのスクリプト言語があり、テキストファイルの最初の行はどのタイプのインタープリタを使用するのかを伝えます。ファイルの残りの部分にスクリプトコードが入ります

#!/usr/local/bin/perlコマンドの後に-wスイッチを付けると、スクリプトにエラーの可能性があれば、Perlに警告を出力させます。あなたのPerlスクリプトに、常に-wフラグを使うことを強く推奨します。

Perl関数モジュール

Perlの標準配布物はプログラマが利用できる大量の関数を持っていますが、必要であればさらに多くの関数をPerlへ追加するためにPerlの特別追加モジュールをインストールすることができます。

毎回全てのPerl関数を読み込むことはPerlプログラムを遅くします(この定義は完全に正しくはないが、今はこれで十分)。もっと良い方法は、必要な時だけPerlに関数を読み込むことです。

例えば、リモートファイル(別のコンピュータに存在するファイル)を自分のコンピュータにコピーするネットワークアプリケーションを書いているとします。その時PerlにNet:remotecopy関数が必要でしょう(このコマンドはただ架空のもの)。この関数はPerlにデフォルトでは存在しないため、Perlに関数を読み込むことを伝えなければなりません。これはPerlでuseコマンドを使うことによって行います:

use Net:remotecopy;

この行はPerlに"remotecopy"関数を読み込むように伝えています。Net:remotecopyを読み込んだ後、Perlプログラムでリモートコピーのコマンドを全て使うことができます。これは次のPerl-Fuスクリプト(Gimpの機能を利用しているPerlスクリプトをこう名づけているわけです)に似ています。

use Gimp;

use Gimp::Fu;

これはPerlに、Gimp機能とGimp::Fu機能を 読み込むように言っています。では、なぜ二つのモジュールを 読み込む必要があるのでしょう? それはGimpモジュールはGimpの基本機能をPerlで 提供しており、Gimp::Fuモジュール (Gimpモジュールに依存しています)は、 Perl-Fuスクリプトを簡単に書けるように、 より多くのGimp関数を1セット読み込んでいる、 ということです。

Perl変数

変数は物を保管しておくことができる入れ物です。例えば、変数Aは値10を保管しておくことができます。Perlでは、このように変数を定義します:

$variable = 10;

終りの";"に注意してください。 これは、コマンドの終りに達したことをPerlに知らせます (全てのPerlコマンドで必須です)。

$variable

=

10

;

でも、これじゃエレガントじゃないよね?

Perl関数

Perlでの関数何かを行う一種のルーチンです。ほとんどの場合、 関数は様々な方法でプログラマを助けるために使われます。

何回もコードに同じことを書く代わりに、プログラマはこれを一度、一つの関数として書くことができます。それから必要に応じてこれを呼出すことができます。つまり、これらのコードを全行打込む必要がない、ということであり、より簡単に理解できるコードを手に入れる、ということでもあります。

実際、(Gimpモジュールのような)機能モジュールを取り込むと、 自分のコードの中で使用することのできる 多くの関数が取り込まれます。 例えば、Gimpの表示を更新するgimp_displays_flush関数が それに当ります。 Gimpの表示を更新するには、次のように入力します:

gimp_displays_flush();

すると表示が更新されます。これは"flush display"するコードを必要になるたびに書く (この場合は関数を実装する方法も知らなければなりません) よりも明らかに簡単です(その使い方を知るだけですみます)。

自分の関数(サブルーチンとも言います)を 作るには、特殊な名前subの後に 実装したい関数の名前を書くことによって、関数を宣言しなければなりません:

sub karins_flush_display {

gimp_displays_flush();

}

これは当然無意味な関数です。それにもかかわらず、gimp_displays_flush();関数の呼び出しの代わりにkarins_flush_display();を使うことができます。

Perl-Fuスクリプトは、 Gimpの画像を操作したり作成したりするのに使う 一つまたは複数の自分で定義したサブルーチンを持ちます。

変数と関数

Perl-Fuスクリプトの中に、よく次のようなものを見かけます:

sub some_function {

my($variable1, $variable2) = @_;

#サブルーチンコード

#ハッシュマークはPerlスクリプトではコメントマークです

}

キーワードmyは、 変数($variable1$variable2) をそのサブルーチンの局所変数にします。 それは、これらの変数や変数がもつ値に、 サブルーチンの外からアクセスできないことを意味します

@_は、サブルーチンへの呼出引数が格納される特殊な変数です(んーと、これは完全には正しくないんだけど、今のとこはこれで十分さ。ここで完全にしすぎて複雑にしたくないだけなんだよ)。次のコードを持っているとします:

sub some_function {

my($variable1, $variable2) = @_;

print $variable1 + $variable2;

#(print will simply print the sum \
of $variable1 and $variable2)

}


some_function(1,2);

そうすると、some_function12を引数として呼び出されます。Perlはファイル全体を読み込み、サブルーチンを保管します。それから、Perlは最初のコマンド、この場合はsome_function(1,2);を実行します。

my($variable1, $variable2) = @_;の行により、 $variable1に1が、$variable2に2が 代入されます。特殊な変数@_に、1と2がこの順序で 格納されているからです。 次の行は、単に3と印字します。 1と2の和が3だからです。

Perl-Fuの特別形

Perl-Fuスクリプトの特別なところは、Perl-Fuの登録部分で使われる\&function_nameです(心配しなくても大丈夫、DovがPerl-Fuの登録部分をカバーしているから)。なにはともあれ、これはPerlスクリプトで呼び出すサブルーチンを取り込む非常に特別な方法なのです。Perl-Fuの登録部分で、 最初で唯一のサブルーチンを呼び出すとき、 この種の参照を用いなければなりません。

ループ

何度も何度も同じことを繰り返したいでしょうか? それなら、Perlのループ機能を使うべきです。Perlではこれを行ういくつかの方法がありますが、Dovのチュートリアルで使われているので、forループだけを説明しましょう。

このチュートリアルでDovはこのようにforループを使っています:

$number_of_loops = 10;

for ($i=0; $i<$number_of_loops; $i++) {

#(The code)

}

$i=0; $i<$number_of_loops; $i++は、ループの初期変数値が0($i=0)であり、ループが巡るたびに$iに1を加算する($i++)ことを伝えています。ループを開始する前に$iが10よりも少ないかを確認しています($i<$number_of_loops)。少なければループを継続し、多ければループを終了します。

$number_of_loops = 10;


for ($i=0; $i<$number_of_loops; ++$i) {

print $i;

}

これはコードを実行した時に0123456789を印字するシンプルなループの例です。この行はループを10回行い、0から始めて9で終わることを表しています。

最後の注意

Perlについてまだ十分に学んだわけではありません。Dovのチュートリアルを理解するのに必要なPerl関数のいくつかを、かろうじてお見せしたに過ぎません。Perl-Fuが面白いものだと思ったら、「初めてのPerl」本を買うことを提案します。

Perl-Fuの配布物で見付かるサンプルのPerl-Fuスクリプトが一緒になっているような本や、もちろんPerl-Fuマニュアルページ(付録のPerl-Fuマニュアルページにある)は、Perl-Fuの探索を始めるには非常に良いスタートです。また、Dovの優秀なPerl-Fuチュートリアルを読むことを忘れないでね --なんたってそれが義務みたいなものだから!


prevcontentnext


Frozenriver Digital Design
http://www.frozenriver.nu
Voice: +46 (0)31 474356
Fax: +46 (0)31 493833
support@frozenriver.com
Publisher Coriolis
http://www.coriolis.com