2 Comments
 前回更新してからあっという間に一ヶ月。いやはや月日が経つのは早いものです。

 そんなこんなで恒例の一ヶ月放置ブログに表示されちゃう広告阻止エントリw

 本日はWindowsでPerlドロップレットを手軽に利用しようというものです。さてドロップレットっていう言葉に馴染みが無い方に簡単に説明しますとようするに「Perlスクリプトファイルに処理対象のファイルをドラッグアンドドロップすることでPerlスクリプトを実行する」という仕組みです。

 さてこの挙動を実現する方法ですがWindowsで調べたところさくっと見つかるのが各種スクリプトをドロップレットとして利用できるようにするアプリケーション「Drop on Script」こいつを使うとPerlだけでなくTcl/TkやPythonやRubyなんかもドロップレットとして利用できるようでなかなか便利そう。ただし2004年を最後に更新が止まっているようです。

 まあ、今紹介したアプリを使ってドロップレットとして利用してもいいっちゃあいいんですが、それじゃあ今回のブログネタとしてはちとおもしろみに欠けます。ここはひとつ他のアプリなんかをインストールせずともなんちゃってドロップレットを作成する方法をご紹介します。

 この方法ですが、実は一年ほど前会社の後輩が使っていたのを見た際に初めて知った方法です。その方法ですがbatファイルに処理対象テキストをドロップするという方法です。まあバッチファイルでPerlスクリプトを呼び出して実行しているのかなあと最初は思ったんですがそのバッチファイルを開いてみてビックリ。なんとバッチファイルの中にPerlのソースコードが書かれているではありませんか。よくよくみてみると凄く上手い具合にPerlのソースが実行されるようになっている! ビックリして後輩に聞いたところ、

「なんかActive Perlの中にあったバッチファイルをみたらこんな書き方をしてて、よくわかんないけど動くんです」

 とのこと。そこでActive Perlのインストールディレクトリを見るとbinフォルダの中にいろいろなバッチファイルが入っておりそれらバッチファイルが今回紹介する方法で記述されていました。ちなみに以下の内容がそのバッチファイルの基本形です。


@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S "%0" %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
goto endofperl
@rem ';
# ここからPerlスクリプトの内容を記述する
#!perl -w
use utf8;
binmode STDOUT, ":encoding(cp932)"; #-画面に出力したい文字コード
binmode STDERR, ":encoding(cp932)"; #-エラー出力に使いたい文字コード ":utf8"
binmode STDIN, ":encoding(cp932)"; #-標準入力から入ってくる文字コード
while (<>) {
print $_;
}
print "\n処理が終了しました\n== PUSH RETURNKEY ==";
my $TEST = <STDIN>;

__END__
# ここまでPerlスクリプト
:endofperl


 いかがでしょうか? 上記のソースを「test.bat」等の名前のバッチファイルとして保存し適当なテキストファイルをドロップしてみください。コマンドプロンプトが起動し結果が表示されます。

 さてこのソースを簡単に説明します。まずファイルがドロップされるとWindowsはこのファイルを「バッチファイル」として認識します。すると「@rem = '--*-Perl-*--」というコメント行から11行目の「@rem ';」の範囲がバッチファイルとして実行されます。Perlのソース部分は「goto endofperl」の一文で華麗にスルーされています。バッチファイルの内容はというと渡されたファイルのパスを引数として自分自身(%0)をPerlスクリプトとして実行するというものです。「perl -x -S "%0" %*」が自分自身をPerlスクリプトとして実行している部分です。このぶぶんが実行されるとWindowsはtest.batを今度は「Perlスクリプト」として実行します。

 Perlスクリプトとしてtest.batを見た場合1行目の@remから11行目までが「@remという配列の定義」として扱われて実質Perlスクリプトの実行に影響しないようになっています。このように、

「バッチファイルとして実行しても正しく実行され、なおかつPerlスクリプトとして実行しても正しく実行される」

 という巧みな方法でPerlスクリプトを手軽にドロップレット化することができます。

 今回この方法をふと思い出したのは会社の業務でちょっとしたドロップレットを作ろうと思ったのがきっかけ。たしかバッチファイルを使って出来たんだよなあと思いながら始めたんですがなかなか思い出せず調べるのに一苦労でした。Active Perlのインストールフォルダにバッチファイルがあることも忘れていてGoogle先生に問い合わせしつつ四苦八苦。すでに一般常識くらいの勢いなのかほとんど検索しても今回紹介した方法はでてきません。唯一発見したのがこちらのページ「ActivePerlだけのTips」こちらのページで「不思議なバッチファイル」として紹介されています。

 えー、ちなみに検索で発見した際、すでにリンクの色が訪問済(このページを見たことも既に忘れていた)になっていたのは秘密です。

 いやー、とりあえず忘れないように今回もまた自分のブログにエントリ。これでまたひとつ賢くなったぞっと!

※追記:えー、調べたところActive Perlのインストールフォルダにあるbinの中に「pl2bat」というファイルがありそれを使うとPerlスクリプトを今回紹介した形式のファイルへバシッと変換してくれるようです。ほー、便利ですなあ
ひらくん
Posted byひらくん

Comments 2

There are no comments yet.
otn  
No title

これって、-x オプションを書いていながら、そのオプションの意味をわかってない人が書いた間抜けプログラムに見えます。

2011/04/08 (Fri) 13:03 | EDIT | REPLY |   
ひらくん  
Re: No title

>otnさん
いやー、Active Perlで使われているbatを基本丸写ししたので-xが指定されていることに言われて初めて気がつきました(^^; そして実行時オプションなんてほとんどつかったことがないので-xの存在を初めてしりました。いやー、お恥ずかしい。。。
こんなオプションあったんですねえ。これを使ったらいろいろとトリッキーなことができそう。
つっこみありがとうございました。またよろしくお願いいたします

2011/04/13 (Wed) 03:15 | EDIT | REPLY |   

Leave a reply