perl の Expect を使ってみた。でも、動作ログが取れません。マニュアルのリファレンス部分には
1. ファイル名を直接渡す方法」
3. 関数を呼ぶ方法
4. 出力を解除する方法
が載っているが、
2. ファイルハンドルを使う方法
だけ書かれていない。試しに書いてみると
ソースを見ると、ref($file) が 'CODE' だとファイルハンドルと認識するようだが、私のファイルハンドルは GLOB となっている。
う~ん、CODE って何? GLOB って何?(「型グロブ」の「グロブ」?型グロブって何?) という状態で数時間固まっております。
さて、ファイル名を与えると正しく動くことは確認済みなんだが、どうするかなぁ。ファイルハンドルを持ち回した方が使いやすそうなのだが。
誰か教えて~。昔入っていた perl な ML が分からなくなってしまいました。
$object->log_file("filename" | $filehandle | \&coderef | undef)
と書かれていて、ファイルハンドルを使えるように読める。だが、例の部分には1. ファイル名を直接渡す方法」
3. 関数を呼ぶ方法
4. 出力を解除する方法
が載っているが、
2. ファイルハンドルを使う方法
だけ書かれていない。試しに書いてみると
#! /usr/bin/perl -Tw
use lib qw(...略...);
require 5.6.0;
use Expect;
use strict;
$ENV{PATH} = "/bin:/usr/bin";
# log ファイルを開く
open($main::LOG, '>', "log_log");
printf "ref \$main::LOG is %s\n", ref $main::LOG;
my $exp = Expect->spawn("ls", "-l") or die "Cannot spawn ls: $!\n";
# $exp->debug(3);
# $exp->exp_internal(1);
$exp->expect(3 , # timeout
[
qr/.*/s => sub {
$exp->log_file($main::LOG);
$exp->print_log_file("--- ls command. ---");
$exp->send("ls\n");
exp_continue;
}
],
[ timeout => sub { print "timeout?\n"; } ],
);
これを実行use lib qw(...略...);
require 5.6.0;
use Expect;
use strict;
$ENV{PATH} = "/bin:/usr/bin";
# log ファイルを開く
open($main::LOG, '>', "log_log");
printf "ref \$main::LOG is %s\n", ref $main::LOG;
my $exp = Expect->spawn("ls", "-l") or die "Cannot spawn ls: $!\n";
# $exp->debug(3);
# $exp->exp_internal(1);
$exp->expect(3 , # timeout
[
qr/.*/s => sub {
$exp->log_file($main::LOG);
$exp->print_log_file("--- ls command. ---");
$exp->send("ls\n");
exp_continue;
}
],
[ timeout => sub { print "timeout?\n"; } ],
);
> ./test
ref $main::LOG is GLOB
Given logfile doesn't have a 'print' method at ./test line 22
Exit 255
駄目じゃん。ref $main::LOG is GLOB
Given logfile doesn't have a 'print' method at ./test line 22
Exit 255
ソースを見ると、ref($file) が 'CODE' だとファイルハンドルと認識するようだが、私のファイルハンドルは GLOB となっている。
う~ん、CODE って何? GLOB って何?(「型グロブ」の「グロブ」?型グロブって何?) という状態で数時間固まっております。
さて、ファイル名を与えると正しく動くことは確認済みなんだが、どうするかなぁ。ファイルハンドルを持ち回した方が使いやすそうなのだが。
誰か教えて~。昔入っていた perl な ML が分からなくなってしまいました。