【发布时间】:2014-10-06 21:07:46
【问题描述】:
这是一个小的 Perl 服务器。它显示 (1),接受一行输入,然后显示 (2),等等。如果您键入“错误”或“提交”,它会给出一条自定义消息。如果你输入“exit”,它就会退出。否则,它只会无休止地输入行数。
use strict;
use warnings;
$|++;
my $counter = 1;
print "($counter) ";
while (<STDIN>) {
chomp;
if ($_ eq "error") {print "Error on command #$counter\n";}
if ($_ eq "commit") {print "Committing data\n";}
if ($_ eq "exit") {print "Exiting program...\n"; exit;}
$counter++;
print "($counter) ";
}
现在,这里是一个 Expect.pm 客户端脚本,它通过键入不同的行来与服务器脚本交互。
use strict;
use warnings;
use Expect;
$|++;
my $exp = new Expect;
$exp->raw_pty(1);
$exp->log_file("/tmp/expect.out");
$exp->log_stdout(1);
my @commands = (
"This is the first command",
"Here is the second command",
"error",
"commit",
"This is the last command",
"exit",
);
$exp->spawn("./expecttest_server.pl");
foreach my $command (@commands) {
print "$command\n";
$exp->send("$command\n");
$exp->expect(1, '-re','\(\d+\)');
}
$exp->soft_close();
我想要的是能够从头到尾存储整个会话,包括服务器脚本生成的所有内容,以及 Expect.pm 脚本发送的所有内容。
也就是说,我希望我的客户端脚本能够返回这样的输出,如果您手动运行服务器脚本并与之交互,您会看到:
(1) 这是第一个命令 (2) 这里是第二条命令 (3) 错误 命令 #3 出错 (4) 提交 提交数据 (5) 这是最后一条命令 (6) 退出 退出程序...但运行客户端脚本后的 STDOUT 显示如下:
这是第一个命令 (1) (2) 这里是第二条命令 错误 (3) 命令 #3 出错 (4) 提交 这是最后一条命令 提交数据 (5) (6) 退出 退出程序...$exp->log_file (tmp/expect.out) 指定的文件显示:
(1) (2) (3) 命令 #3 出错 (4) 提交数据 (5) (6) 退出程序...我尝试通过记录命令本身 + $exp->expect() 返回的 before_match 和 after_match 变量的各种组合来进行试验。但到目前为止,我还没有得到正确的组合。这似乎是一种非常笨拙的方式来获取我正在寻找的东西。
那么,捕获整个 Expect.pm 会话的最佳做法是什么?
感谢任何可以提供帮助的人!
【问题讨论】:
-
为什么在将
This is the first command打印到STDOUT在 发送到服务器程序之前会得到(1) This is the first command?你得到的输出正是我所期望的(双关语不是故意的)。 -
@ThisSuitIsBlackNot:如果只是将第一个命令附加到输出变量或文件中,那将很容易。更棘手的问题是,STDOUT 或 $exp->log_file 都不包含格式化的数据,如果您自己与程序交互,它会实际出现。标记为“它应该看起来像这样”的块是我无法弄清楚如何在我的客户端脚本中重建的块。
-
所以“它应该看起来像这样,”我猜你的意思是,“我希望它看起来像这样。”
-
为什么不把
print "($counter) $_";放在你的服务器上?