2013-04-19 2 views
0

Я хочу сравнить значения хэша, как показано ниже. Мне нужно проверить ....Как сравнить значения хэша

---> если все значения хэша «УСПЕХ», затем распечатайте сообщение только один раз.

---> else, если даже одно значение является «FAILURE», а затем печатать другое сообщение только один раз.

Пожалуйста, обратите внимание, что мне нужно напечатать сообщение в любом случае ТОЛЬКО РАЗ

Это мой код (с одним из значений является «FAILURE»)

#!/usr/bin/perl -w 
use strict; 

my $hash = { 
       1 => 'SUCCESS', 
       2 => 'SUCCESS', 
       3 => 'SUCCESS', 
       4 => 'FAILURE', 
      }; 

foreach my $key (keys %$hash) 
{ 
    if ($hash->{$key} eq 'FAILURE') 
    { 
     print "One of the Keys encoutered failure. Cannot proceed with Automation \n"; 
     last; 
    } 
    elsif ($hash->{$key} eq 'SUCCESS') 
    { 
     next; 
     print "All the Keys were successful. Proceeding to Automation \n"; 
    } 
} 

ВЫВОД:

One of the Keys encoutered failure. Cannot proceed with Automation 

Это нормально работает, когда один из ключей содержит «FAILURE».

НО ..... Это не работает, когда все значения "УСПЕХ":

#!/usr/bin/perl -w 
use strict; 

my $hash = { 
       1 => 'SUCCESS', 
       2 => 'SUCCESS', 
       3 => 'SUCCESS', 
       4 => 'SUCCESS', 
      }; 

foreach my $key (keys %$hash) 
{ 
    if ($hash->{$key} eq 'FAILURE') 
    { 
     print "One of the Keys encoutered failure. Cannot proceed with Automation \n"; 
     last; 
    } 
    elsif ($hash->{$key} eq 'SUCCESS') 
    { 
     next; 
     print "All the Keys were successful. Proceeding to Automation \n"; 
    } 
} 

ВЫВОД:

huh..there is no output. It brings me back to the bash shell. 

Теперь, если я Закомментируйте next из цикла else , то он печатает инструкцию hte 4 раза.

All the Keys were successful. Proceeding to Automation 
All the Keys were successful. Proceeding to Automation 
All the Keys were successful. Proceeding to Automation 
All the Keys were successful. Proceeding to Automation 

ВОПРОС:

Таким образом, в этом случае я хочу, чтобы напечатать заявление «Все ключи были успешно протекающие автоматизации.» только один раз. Как я могу это сделать?

Спасибо.

ответ

3

Ваше использование next заставляет цикл немедленно перейти к следующей итерации. Вот почему вы не видите никакого выхода - выполнение программы никогда не достигает оператора print, следующего за next.

Что вы можете сделать, это использовать переменную флаг:

#!/usr/bin/perl -w 
use strict; 

my $hash = { 1 => 'SUCCESS', 
      2 => 'SUCCESS', 
      3 => 'SUCCESS', 
      4 => 'SUCCESS', 
      }; 

my $failure = 0; 
foreach my $key (keys %$hash) 
{ 
    if ($hash->{$key} eq 'FAILURE') 
    { 
    $failure = 1; 
    last; 
    } 
} 

if ($failure == 1) { 
    print "One of the Keys encoutered failure. Cannot proceed with Automation \n"; 
} else { 
    print "All the Keys were successful. Proceeding to Automation \n"; 
} 
+0

Вы можете дополнительно ShortCUT чек отказа с добавления 'последний,' после установки переменной сбоя, так как нет необходимости проверять все значения хеш-функции, если один из них уже неисправен. – dgw

+0

@dgw: Хороший улов, добавил, что в. –

Смежные вопросы