まだまだある! PerlのHello World
第17回は、Perlの続編です。Perlは第6回で取り上げましたが、今回は、前回では掲載しきれなかったPerlのHello Worldを、そのGUIのプログラムも含めて取り上げます。
format/writeを使う方法
Perlのformat/writeを使うと、書式指定を伴った出力が可能です。これを利用したHello Worldは、リスト1のとおりです。
標準出力に対して出力する場合、標準出力のファイルハンドル名と同名のSTDOUTに対して、formatで書式を指定します。formatでは、文字列の左寄せや右寄せなどの指定が可能ですが、ここでは、書式として「@*」を用いて、文字列をそのまま出力することを指定しています。
なお、formatやwriteでは、デフォルトでSTDOUTが指定されたものとみなされるため、STDOUTの記述は省略可能です。
__DATA__を使う方法
固定の文字列を出力する場合、__DATA__トークンを利用して、文字列を直接Perlスクリプトの後半に記述する方法が便利です(リスト2)。この方法は、第14回(CGI編)ですでに用いています。
__DATA__トークン以降の部分は、Perlのプログラムとしてはすべて無視され、この部分の文字列は、特殊ファイルハンドルの<DATA>を使って読むことができるようになります。そこで、これをprintでそのまま出力してやればよいのです。
__END__を使う方法
__DATA__トークンの代わりに、__END__トークンを使っても同様に動作します。ただし、この場合でも、ファイルハンドルは<DATA>を用いる必要があります(リスト3)。なお、パッケージ内部で使用する場合は、__END__ではなく、__DATA__を使用する必要があります。
execでOS上のコマンドを実行
PerlからOS上のコマンドを呼び出して実行するには、第6回で取り上げたとおり、systemを使います。しかし、Perlスクリプトの最後にOS上のコマンドを呼び出し、その後Perlに戻る必要がない場合は、systemの代わりにexecを用いて、プロセスを節約することができます(リスト4)。これは、シェルスクリプトの最後にexecコマンドを使う手法と同様で、Perlと同じプロセスIDのまま、OS上のコマンドが実行されます。
execでOS上のコマンドを効率よく実行
execでOS上のコマンドを実行する際、execの引数が1つで、シェルによって解釈するべき特殊文字を含んでいる場合、実際には「/bin/sh -c」を経由してコマンドが実行されます。
これを避けるためには、execの引数を複数に分割して記述します(リスト5)。これで、少し実行効率が改善されます。なお、同じことはexecの代わりにsystemを使う場合にも言えます。
Perl/Tkを使う方法
次に、Perlを使ったGUIのHello Worldを作成してみましょう。Perlから利用できるGUIのモジュールには複数の種類がありますが、まずはPerl/Tkです(リスト6、図1)。Perl/Tkでは、文字列を表示するラベルを作成し、それをpackし、メインループを実行すればOKです。
Perl/Tkは、TkのインタフェースをPerl上に再移植したものです。このため、PythonのTkinterやRuby/Tkとは違って、Tcl/Tkがインストールされていない環境でも、Perl/Tkだけで単独で動作します。
なお、このプログラムには終了メニューが含まれていないので、ウィンドウマネージャのメニューなどを使って終了させてください。これは、以降のGUIプログラムについても同じです。
図1 Perl/Tkを使ったHello World |
Gtk2モジュールを使う方法
Gtk2モジュールを使う場合は、リスト7、図2のようになります。ここで、「use Gtk2 -init;」という記述は「use Gtk2; Gtk2->init;」と等価で、同時に初期化を行っていることになります。
プログラムでは、文字列を表示するラベルを作成し、トップレベルウィンドウに貼り付け、可視状態にしてメインループを実行しています。Gtk2では、正常終了のために、destroyシグナルに対しては終了ハンドラを設定する必要があります。
図2 Gtk2モジュールを使ったHello World |
Wxモジュールを使う方法
次はWxモジュールです。これはリスト8、図3のとおりです。Wxを初期化したあと、フレームを作成し、フレームの中にパネルを作成し、そのパネル上に表示する文字列を配置します。あとはフレームを可視状態にしてメインループを実行すればOKです。
図3 Wxモジュールを使ったHello World |
SDL_perlを使う方法
最後に、SDL_perlです(リスト9、図4)。SDL_perlでは、デフォルトではウィンドウのバックが黒色になるため、これを白色で埋めるための処理を加えています。
フォントは、フォントファイル自体を絶対パスで指定する方式になっています。この部分はOS環境によって修正する必要があるでしょう。フォントファイルは、「-ttfont」の記述からもわかるとおり、TrueTypeフォントが使用可能ですが、ここではビットマップフォント(pcf)を指定しています。
指定したフォントを使ってウィンドウ上にメッセージを表示したら、ウィンドウの再描画を指示してメインループを実行します。ここで、正常終了のために、SDL_QUIT()のイベントハンドラだけは設定する必要があります。
図4 SDL_perlを使ったHello World |