まだまだある! 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の記述は省略可能です。

リスト1 format/writeを使う方法(perl_write)

__DATA__を使う方法

固定の文字列を出力する場合、__DATA__トークンを利用して、文字列を直接Perlスクリプトの後半に記述する方法が便利です(リスト2)。この方法は、第14回(CGI編)ですでに用いています。

__DATA__トークン以降の部分は、Perlのプログラムとしてはすべて無視され、この部分の文字列は、特殊ファイルハンドルの<DATA>を使って読むことができるようになります。そこで、これをprintでそのまま出力してやればよいのです。

リスト2 __DATA__を使う方法(perl_data)

__END__を使う方法

__DATA__トークンの代わりに、__END__トークンを使っても同様に動作します。ただし、この場合でも、ファイルハンドルは<DATA>を用いる必要があります(リスト3)。なお、パッケージ内部で使用する場合は、__END__ではなく、__DATA__を使用する必要があります。

リスト3 __END__を使う方法(perl_end)

execでOS上のコマンドを実行

PerlからOS上のコマンドを呼び出して実行するには、第6回で取り上げたとおり、systemを使います。しかし、Perlスクリプトの最後にOS上のコマンドを呼び出し、その後Perlに戻る必要がない場合は、systemの代わりにexecを用いて、プロセスを節約することができます(リスト4)。これは、シェルスクリプトの最後にexecコマンドを使う手法と同様で、Perlと同じプロセスIDのまま、OS上のコマンドが実行されます。

リスト4 execでOS上のコマンドを実行(perl_exec)

execでOS上のコマンドを効率よく実行

execでOS上のコマンドを実行する際、execの引数が1つで、シェルによって解釈するべき特殊文字を含んでいる場合、実際には「/bin/sh -c」を経由してコマンドが実行されます。

これを避けるためには、execの引数を複数に分割して記述します(リスト5)。これで、少し実行効率が改善されます。なお、同じことはexecの代わりにsystemを使う場合にも言えます。

リスト5 execでOS上のコマンドを効率よく実行(perl_exec2)

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プログラムについても同じです。

リスト6 Perl/Tkを使う方法(perl_tk)

図1 Perl/Tkを使ったHello World

Gtk2モジュールを使う方法

Gtk2モジュールを使う場合は、リスト7、図2のようになります。ここで、「use Gtk2 -init;」という記述は「use Gtk2; Gtk2->init;」と等価で、同時に初期化を行っていることになります。

プログラムでは、文字列を表示するラベルを作成し、トップレベルウィンドウに貼り付け、可視状態にしてメインループを実行しています。Gtk2では、正常終了のために、destroyシグナルに対しては終了ハンドラを設定する必要があります。

リスト7 Gtk2モジュールを使う方法(perl_gtk)

図2 Gtk2モジュールを使ったHello World

Wxモジュールを使う方法

次はWxモジュールです。これはリスト8、図3のとおりです。Wxを初期化したあと、フレームを作成し、フレームの中にパネルを作成し、そのパネル上に表示する文字列を配置します。あとはフレームを可視状態にしてメインループを実行すればOKです。

リスト8 Wxモジュールを使う方法(perl_wx)

図3 Wxモジュールを使ったHello World

SDL_perlを使う方法

最後に、SDL_perlです(リスト9、図4)。SDL_perlでは、デフォルトではウィンドウのバックが黒色になるため、これを白色で埋めるための処理を加えています。

フォントは、フォントファイル自体を絶対パスで指定する方式になっています。この部分はOS環境によって修正する必要があるでしょう。フォントファイルは、「-ttfont」の記述からもわかるとおり、TrueTypeフォントが使用可能ですが、ここではビットマップフォント(pcf)を指定しています。

指定したフォントを使ってウィンドウ上にメッセージを表示したら、ウィンドウの再描画を指示してメインループを実行します。ここで、正常終了のために、SDL_QUIT()のイベントハンドラだけは設定する必要があります。

リスト9 SDL_perlを使う方法(perl_sdl)

図4 SDL_perlを使ったHello World