Perl 以未知顺序将多个模式与Expect.pm匹配

Perl 以未知顺序将多个模式与Expect.pm匹配,perl,expect,Perl,Expect,我目前正在编写一个脚本来自动配置服务器。我使用Expect.pm模块与服务器交互,但现在我面临一个不知道如何解决的问题 我试图做的是向服务器发送一个命令,该命令将列出服务器上当前安装的设备,然后检查该列表中是否有某些项目。问题是列表的顺序是随机的,所以我不知道应该先看到什么 我试图完成的是找到所有项目,然后在所有项目都匹配后退出expect调用。请记住,每台服务器都有自己的设备集,并且我必须匹配的设备数量可能会有所不同,因此解决方案必须解决一般情况。有没有办法用Expect.pm实现这一点?我已

我目前正在编写一个脚本来自动配置服务器。我使用
Expect.pm
模块与服务器交互,但现在我面临一个不知道如何解决的问题

我试图做的是
向服务器发送一个命令,该命令将列出服务器上当前安装的设备,然后检查该列表中是否有某些项目。问题是列表的顺序是随机的,所以我不知道应该先看到什么

我试图完成的是找到所有项目,然后在所有项目都匹配后退出
expect
调用。请记住,每台服务器都有自己的设备集,并且我必须匹配的设备数量可能会有所不同,因此解决方案必须解决一般情况。有没有办法用
Expect.pm
实现这一点?我已经尝试了一段时间,但似乎找不到一个好的解决方案

提前谢谢

/哈索

编辑:我找到了一个解决方案

我编写了一个函数,它将为
expect
调用构造参数数组,然后进行调用。本例中的引用
$self
是我自己定义的对象,但
$self->{u expect}
是expect对象

sub match_all {
    my $self = shift;
    my $timeout = shift;
    my @patterns = @_;

    my $pattern_count = @patterns;
    my $match_count = 0;

    #Function that is called when a pattern is matched
    sub match{
        my $exp = shift;
        my $mc_ptr = shift;
        my $pc_ptr = shift;
        $$mc_ptr++;
        if($$mc_ptr != $$pc_ptr) {
            #Set the accumelator to the before and after string,
            #effectivly cutting away the matched substring.
            my $before = $exp->before();
            my $after = $exp->after();
            $exp->set_accum($before.$after);
            exp_continue_timeout;
        }
    }

    #Build the array of patterns for the expect call
    my @exp_patterns;
    foreach my $pattern (@patterns) {
        push @exp_patterns, [$pattern, \&match, \$match_count, \$pattern_count];
    }

    #Set notransfer to True in order to manipulate
    #the accumelator on my own during this function
    $self->{_expect}->notransfer(1);
    $self->{_expect}->expect($timeout, @exp_patterns);
    $self->{_expect}->notransfer(0);

    return $match_count == $pattern_count;
}
一套装置

这是个神奇的词。使用


如果
$expect\u devices->is\u subset($known\u devices)
,您就有了“匹配项”。

您好,谢谢您的回答。你所建议的解决方案确实是问题的解决方案,尽管它不是我们真正想要的。问题是为了使用这个解决方案,我必须解析列表以创建集合。此外,我还必须等待完全超时,然后才能测试是否所有项目都在集合中。