Perlでコマンドプロンプトにサヨナラする(2)
WindowsのStrawberryPerlの環境で、ダイアログ式の入出力をしてみたいと思います。
ダイアログの話なので、Tkモジュールでも使うのがいいかなぁと考えていましたが、なぜか簡単にインストールできなかったのでやめました(汗)
ただ、Windows環境ならばもっとほかの手があります!
There's More Than One Way To Do It!
(Perlのスローガン「やり方はひとつじゃない」)
準備
Windowsが持っているActiveBasicをPerlから実行して、ダイアログを呼び出すことを実現します。
まずは、PerlでWin32::VBScriptというモジュールを使えるように下記のとおり打ち込んで準備をします。(StrawberryPerlでの例です。ActivePerlなどでのやり方は各自調べていただきたく)
cpan Win32::VBScript
出力
use Win32::VBScript qw(:ini);
my $vbscript= compile_func_vbs([ <<'EOF' ]);
Function Response(ByVal Message, ByVal Buttons, ByVal Title)
Response= MsgBox(Message, Buttons, Title)
End Function
EOF
{
no strict 'refs';
*{'::msgbox'} = $vbscript->func('Response');
}
msgbox("Hello, Perl World by VBScript!", 65536, "Title");
詳しく説明するとややこしいプログラム。
これを平たく言いますと、「最後にあるmsgbox関数で、メッセージボックスを呼び出します。このプログラムの12行目まではそのサブルーチンだから、分からなければ無視!」でしょうか(笑)
msgbox関数は、第1引数にメッセージを、第3引数にタイトルを指定します。
第2引数の「65536」は、最前面に表示する指定です。
入力
同じように、VBScriptのInputBoxを呼び出してみます。
use Win32::VBScript qw(:ini);
my $vbscript= compile_func_vbs([ <<'EOF' ]);
Function Question(ByVal Message, ByVal Title)
Question = InputBox(Message, Title)
End Function
EOF
{
no strict 'refs';
*{'::inputbox'}= $vbscript->func('Question');
}
my $ans= inputbox("文字列を入力してください", 'Title');
print "$ans\n";
やはり、12行目まではおまじないということで(笑)
最後辺りにあるinputbox関数で、入力ダイアログを呼び出しています。
第1引数には出力メッセージを、第2引数にはタイトルを指定します。
入力された文字列は$ansに代入されます。
ここではその内容をprintで出力してみています。
入出力をまとめると
use strict; #文法チェックを厳しくする
use warnings; #警告も表示する
use Win32::VBScript qw(:ini);
my $vbscript= compile_func_vbs([ <<'EOF' ]);
Function Question(ByVal Message, ByVal Title)
Question = InputBox(Message, Title)
End Function
Function Response(ByVal Message, ByVal Buttons, ByVal Title)
Response= MsgBox(Message, Buttons, Title)
End Function
EOF
{
no strict 'refs';
*{'::inputbox'}= $vbscript->func('Question');
*{'::msgbox'} = $vbscript->func('Response');
}
my $ans= inputbox("文字列を入力してください", '入力');
msgbox($ans, 65536, "出力");
サブルーチンの存在感がすごいですが(笑)、実際に使うときに使用するのは最後のinputbox、msgboxだけですのでまあまあ悪くはないかと。
(お手軽って難しいです、はい)
メモ
useを使って、Win32:VBScriptを呼び出しています。
これは、PerlからVisualBasicやJavaScriptで書かれたコードを呼び出すモジュールです。
そのコードの書き方は単一行とか、複数行とかあるみたい(サンプルプログラムをみると書いてあるの)ですが、今回は複数行で書いています。
プログラム中の「compile_func_vbs」のある次の行から「EOF」までが、VBScriptになります。
このVBScriptとPerlを橋渡ししているのが、{}で囲まれた「no strict 'refs';」のある部分です。
たとえば、「inputbox関数が使われたら、VBScriptのQuestionというFunctionを呼び出してくださいね」みたいなことが書かれています。
なお、VBScriptの関数は引数が可変ですが、compile_func_vbsの中で引数を指定しているので、Perlから使う場合は可変にはなりません。使いたい引数になるまで増やしてください。(他にうまいやり方があったら教えてください…)