[Most contents are written in Japanese Language] [Always under construction]

[ PC系セットアップ覚書 Top]

PC系セットアップ覚書

2011年まで「俺的な非 UN*X 環境をめざして」という題でしたが、 「UNIX系」と「非UNIX系」の区別がだんだん難しくなってきましたので、 あれこれ区別しないことにしました(^_^;


[前] iPad/iPod touchで動画(見本) 2012/01b

(Win) バッチファイルとPerlスクリプトを合体 2012/01a

コンピュータを使ってると、 ときどき簡単なスクリプトを組みたくなることがあります。 私の場合は、やっぱ慣れてるからという理由で perl (Windowsの場合は、 DOSの頃から(!)使われている JPERL.exe)をどうしても使いたくなります。

ただWindows/DOSの場合、一行目に "#!/Apps/usr-local/bin/JPERL.exe" (私の場合、その場所に JPERL.exe を置くことが多いので‥)とか書いても全く意味がないので、 仕方なくPerlスクリプトと、そのPerlスクリプトを 呼び出すためのバッチファイルの2つを用意していました。 でも「Perlスクリプトを呼び出すためだけのバッチファイル」なんてものを独自に用意するのは カッコ悪いなと思い、その2つを合体させることはできないかと考えてみました。 んで、結論からいえば、両者を合体させることは意外と簡単にできました。

rem ; $COMM = <<START;
\Apps\usr-local\bin\JPERL.exe %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
exit
rem ===== ここまでがバッチファイル部分 =====
START
print "hello, world.\n";
exit;

Perl の「ヒアドキュメント」機能と、「バッチファイルは exit 行以降は無視される」 という経験則を抱き合わせたものです。4行目にある exit までがバッチファイル部分で、 Windowsはそこまでの行を実行するとそこで処理を打ち切ってくれますので、その後には 何を書いても無視してくれます。バッチファイルでは何をしてるかといえば、自分自身を Perl に読み込ませる作業を行い、終わったらとりあえず pause してユーザからの キー入力を待ちます。キーが押されたら終了、と。

他方のPerl視点で見てみると、2〜5行目が $COMM という変数に代入する文字列となっており、 またスクリプト中で $COMM という変数は参照されることがありませんので、結果として 2〜5行目の内容はPerlでは無視されます。スクリプトは実質 START の次の行からとなります。 ここでは正直、一行目の rem がちょっと微妙なところで、 Perl には rem 関数なんてのはないんですけど、一行目にいきなり rem と書いても 問題はないようです。未定義のファイルハンドルと判断されて、単純に未定義だから という理由で何も文句は言われない? のかどうかはわかりませんが、とにかく DOS用のJPerl4、またMacOS X 10.6付属の perl-5.10.0 では私の意図どおり、 つまり2〜5行目の内容がPerlに影響を与えずスクリプトがちゃんと実行されるようです。 これでスクリプトが管理しやすくなったような気がして嬉しいです。 ‥‥まあ、こうしてしまうと何かWindowsに特化してしまった感じになっちゃうのが アレといえばアレなんですけど。



[次] USBメモリで持ち運び、表を使って、計算も 2011/12b