【コラム】

Hello Worldコレクション

17 続・Perl編 - さらに深くPerlの世界を探ってみる

    山森丈範  [2008/10/03]

    まだまだある! 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

    関連したタグ

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン