ActivePerl の perldoc

こんにちは、火曜日の担当、素敵なレディーことhasegawayosukeです。 Shibuya.pm を見に行きたいと言うだけの理由で最近 Perlを始めたのですが、Perlといえばググるより前にperldoc。というわけで、ActivePerlについてるperldocを見てみました。
Windowsでも、コマンドライン

C:\>perldoc perl

などとしてやると、指定されたドキュメントが表示されるわけですが、たいていの場合は環境変数 PAGER や PERLDOC_PAGER、MANPAGER が設定されていないため、使いにくい more コマンド経由でドキュメントが表示されてしまいます。これを改善するにはもちろん事前に環境変数 PAGER (あるいは PERLDOC_PAGER や MANPAGER)を設定するわけで、そうしてやるとそれを使用してperldocが表示されます。例えば

C:\>set PAGER=notepad

としてやると、perldoc がメモ帳で表示されます。
ところが、せっかくperldocがメモ帳で表示されても、perldocを実行した側のコマンドラインはメモ帳を閉じるまでブロックしてしまいます。これでは、複数のperldocを同時に確認したいときに不便でなりません。そこで、PAGER に以下のような指定をしておきます。

C:\>set PAGER=start notepad

このように指定しておくと、perldocコマンドを実行したときにまず start コマンドが呼び出され、start コマンドはnotepadを起動します。notepad が立ちあがると、startコマンドは即座に終了するため、perldocコマンドも速やかにプロンプトに制御を戻します。これだけで格段にコマンドラインでの作業性が上がります。
もちろん、メモ超以外の好きなPAGERを指定できますので、「IEかわいいよIE」という重篤な方は

C:\>set PAGER=start iexplore

などとしておくとよいでしょう。

ちなみに、ActivePerlにおける perldoc は、バッチファイルとPerlスクリプトのハイブリッドなファイルとして実装されています。先頭部分では

@rem = '-- (略)
@echo off
...
perl -x -S %0 %*
...
goto endofperl
@rem ';

となっています。「rem」はバッチファイル上における注釈行を書くためのコマンドで、先頭に@を指定することでバッチファイル内でそれを非表示で実行します(つまり何も実行しない)。Perlスクリプトとして解釈したときにはもちろん、@rem という配列に「'--」から「@rem ';」までの値を代入するという意味ですので、バッチファイルの部分をPerlから隠ぺいできます。このような方法を使うことによって、コマンドラインで perldoc を実行するときにわざわざ「C:\>perldoc.pl perldoc」のように拡張子まで打つ必要がなくなります。うまいやりかたですね。