15.13 Expectで他のプログラムを制御する
STDINとSTDOUTに端末を通じてアクセスすることが前提になっているフルスクリーンプログラムの対話型操作を自動化したい。
- CPANのExpectモジュールを使用する。
use Expect; $command = Expect->spawn("program to run") or die; # プログラムの出力がSTDOUTに表示されることを防止する $command->log_stdout(0); # "Password:"が表示されるのを10秒間待機する unless ($command->expect(10, "Password")) { # タイムアウトになった場合の処理を行う } # /[lL]ogin: ?/に一致する文字列を20秒間待機する unless ($command->expect(20, -re => '[lL]ogin: ?')) { # タイムアウトになった場合の処理を行う } # "invalid"が表示されるのを永遠に待機する unless ($command->expect(undef, "invalid") { # エラーが発生した。プログラムはおそらく異常終了したと思われる。 } # "Hello World"と復帰コードをプログラムに渡す print $command "Hello, world\r"; # プログラムが自力で終了する場合には、次のコマンドで終了する $command->soft_close(); # プログラムを明示的に強制終了する必要がある場合には、次のコマンドで終了する $command->hard_close();