見出し画像

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から使う場合は可変にはなりません。使いたい引数になるまで増やしてください。(他にうまいやり方があったら教えてください…)

いいなと思ったら応援しよう!