0

Expect在 Perl 中使用来完成一项任务。发送命令后,我期待SuccessERROR作为输出,这取决于我需要打印到一个文件,说明它是成功还是失败。

$exp->expect(30,
    '-re', "Success", printf LOG "Successfully Deleted \n" => sub {exp_last;},
    '-re', "ERROR",   printf LOG "Error in Deletion \n",
);

LOG是一个文件句柄。如果我使用它,那么即使我得到命令Success的输出,send两个正则表达式都会被执行。在我的日志文件中,我得到

Error in Deletion
Successfully Deleted

我该如何解决这个问题?

4

1 回答 1

3

printf 是一个列表运算符;第一个 printf 将吞噬所有期望的剩余参数,就像您说的那样:

$exp->expect(30, '-re', "Success",
     printf( LOG "Successfully Deleted \n" =>
         sub {exp_last;},
         '-re',
         "ERROR",
         printf( LOG "Error in Deletion \n" )
     )
 );

所以成功案例是首先打印删除中的错误,然后成功删除。您可能应该改为:

$exp->expect(30,
    '-re', "Success", printf( LOG "Successfully Deleted \n" => sub {exp_last;} ),
    '-re', "ERROR",   printf( LOG "Error in Deletion \n" ),
);

除了没有理由在那里使用 printf 而不是 print 。

更新:据我了解 Expect 文档,这根本不是您执行多种模式的方式,您应该这样做:

my $which_pattern = $exp->expect(30, "Success", "ERROR");
if ($which_pattern) {
    if ($which_pattern == 1) {
        print LOG "Successfully Deleted \n";
    }
    else {
        print LOG "Error in Deletion \n";
    }
}

不需要 -re 除非您实际上使用的是模式而不是显式字符串;不知道你想用这个sub {exp_last;}位实现什么。

于 2010-07-26T10:00:21.120 回答