ちょっと遊んでいたら見つけたのですが、これ簡単ですね。
use IO::Pty::Easy; my $pty = IO::Pty::Easy->new; $pty->spawn("mysql -u root"); while ($pty->is_active) { while (my $o = $pty->read(1)) { print $o; } if (my $sql = <>) { $pty->write($sql); } else { $pty->write("exit\n"); last; } }
こんな感じにするだけで、perl から mysql の shell が叩けるよ。
いや、別に誰も嬉しくないけどさ。
top も叩ける。
use IO::Pty::Easy; my $pty = IO::Pty::Easy->new; $pty->spawn("top"); while ($pty->is_active) { while (my $o = $pty->read(2)) { print $o; } }
いや、別に誰も嬉しくないけどさ。
余談ですが、batch 処理でtopを使うなら、
% top -b
を使うと良いですよ。
Expect 使って書くような処理を書いてみる。
use IO::Pty::Easy; my $pty = IO::Pty::Easy->new; $pty->spawn("htpasswd -c test_passwd ktat"); while ($pty->is_active) { $|= 1; while (my $o = $pty->read(1)) { print $o; if ($o =~m{password:}) { my $passwd; { chomp($passwd = <>); $passwd or redo; } $pty->write($passwd . "\n"); } } }
使いどころはあるんじゃないかな。
vi でファイルを作って、perlで実行とか。
use IO::Pty::Easy; my $pty = IO::Pty::Easy->new; $pty->spawn("vi test_pty.pl"); my @operation = ( chr(0x1b) . 'V', 'G', 'x', 'i', '#!/usr/bin/perl' . "\n", 'print "Hello, World!\n"' . "\n", chr(0x1b), ":wq\n", ); while (@operation) { $pty->write(shift @operation); } while ($pty->is_active) { while (my $o = $pty->read(1)) { # print $o; } } $pty->spawn('perl test_pty.pl'); while (my $o = $pty->read(1)) { print $o; }