foreach中的字符串比较

string comparison in foreach

下面的测试是查看IP地址列表中的软件信息。 该程序按预期在所有 IP 上打印软件版本 运行。

现在,我想测试下软件运行是否所有IP都一样?我该怎么做?

sub test_check_software_info_on_all_the_ips {

    my ($self) = @_;

    $self->{'machine_ip'} = $self->{'queryObj'}->get_machine_ip();

    foreach my $ip ( @{ $self->{'machine_ip'} } ) {

        $self->{'install_info'} = $self->{'queryObj'}->get_install_info($ip);

        INFO( 'Software info of ' . $ip . ' is ' . $self->{'install_info'} );
    }
}

示例输出

20160907T141846   INFO    Software info of 1.1.1.1 is r-2016-08-27-03
20160907T141846   INFO    Software info of 2.2.2.2 is r-2016-08-27-03
20160907T141847   INFO    Software info of 3.3.3.3 is r-2016-08-27-03
20160907T141847   INFO    Software info of 4.4.4.4 is r-2016-08-27-03

这会按照你的要求去做

sub check_matching_info {

    my ($self) = @_;

    my $ips = $self->{queryObj}->get_machine_ip;

    my %info;

    for my $ip ( @$ips ) {
        my $info = $self->{queryObj}->get_install_info($ip);
        push @{ $info{$info} }, $ip;
    }

    print keys %info == 1 ? "All IPs have the same install info" : "IPs have different install info";
}

一如既往,一切都已经为你写好了,你只需要找到它。虽然核心中有一些 gem 可以通过 List::Util 获得,但我们今天想要的不是核心中的,而是 List::MoreUtils.

中的
use List::MoreUtils ('all') ;

sub check_versions_equal
{
  my ($self)= @_ ;
  my @vers= map ( $self->{queryObj}->get_install_info($_) }
            @{$self->{queryObjs}->get_machine_ip ;}
  return true unless @vers ;  # empty list case ;
  my ($v)= @vers ;
  return all { $_ eq $v } @vers ;
}