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();