2016-09-07 2 views
-1

Ниже приведено описание проверки информации о программном обеспечении в списке IP-адресов. Программа печатает версию программного обеспечения, работающего на всех IP-адресах, как ожидалось.сравнение строк в foreach

Теперь, я хотел бы проверить, идентично ли программное обеспечение, работающее на всех 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 
+3

Итак, что вы считали? Это выглядит довольно прямолинейно. Возьмите версию с первого; проверьте, одинаковы ли все остальные, распечатывая любые несоответствующие версии. Конечно, существует риск того, что первая машина будет с нечетной версией. Вы также можете создать хеш с подсчетом каждой версии (с ключом по версии), и когда вы закончите цикл выше, перейдите по клавишам этого нового хэша, чтобы сообщить о версиях и подсчетах. Вы также можете создать хеш-ключ на версии со списком машин, использующих эту версию. И т. Д. Все хорошее чистое базовое программирование на Perl. –

+0

Похоже, вы пишете объектно-ориентированное программное обеспечение, и в этом случае вы должны использовать методы доступа, а не рассматривать '$ self' как обычную хэш-ссылку. – Borodin

ответ

0

Это будет делать, спросите вы

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"; 
} 
0

Как всегда, все уже написано для вас, вы просто должны найти его. Хотя есть некоторые драгоценные камни в ядре, доступные через 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 ; 
}