Practice of Programming

プログラム とか Linuxとかの話題

IO::Pty::Easy が簡単・便利

ちょっと遊んでいたら見つけたのですが、これ簡単ですね。

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;
}