Perl чертовски все значение один раз - PullRequest
0 голосов
/ 29 августа 2011

Я в основном сетевой парень и поэтому не очень хорош в написании сценариев.

При написании некоторых сценариев я столкнулся с требованиями ниже.

У меня есть хэш-массив с некоторыми значениями "1" или "2", и мое требование

если все значения, отличные от «1» (могут быть «2» или «3»), то он напечатает какое-то утверждение один раз, а затем выйдет из этого цикла.

если любое значение равно «1», то будет напечатано какое-то утверждение.

например:

my %hash_array1=(A=>2,B=>2,C=>2);
my @array2=values (%hash_array1);

foreach my $line (@array2) {

    if ($line!=1) {

        print BOLD GREEN "\rNo Evolution ",RESET;

        last;
    }
    else {
        print BOLD RED "Evolution \n",RESET;
    }
}

который печатать

No Evolution

Вышеупомянутый код работает хорошо, как и ожидалось для упомянутого hash_array, потому что все значения не "1", но не работают хорошо для ниже хэшей

my %hash_array1=(A=>1,B=>2,C=>2);

где печатается

Evolution

No Evolution

что не соответствует моим ожиданиям. Я хочу здесь напечатать, как один раз «Эволюция» и «Нет эволюции» больше не должны печататься. (Однако цикл должен продолжаться итерацией)

Пожалуйста, дайте мне знать, если требуется больше ясности.

Привет

Махеш

Ответы [ 3 ]

4 голосов
/ 29 августа 2011
my %hash_array1=(A=>2,B=>2,C=>2);
if ( grep $_ == 1, values %hash_array1 ) {
    print BOLD RED "Evolution \n",RESET;
}
else {
    print BOLD GREEN "\rNo Evolution ",RESET;
}

(Некоторые комментарии говорят о времени выполнения; это не должно вызывать беспокойства, если не продемонстрировано, что существует проблема с производительностью.)

2 голосов
/ 29 августа 2011

Если я правильно читаю ваше требование, вам нужно будет изучить весь набор, если вы не нажмете "1"

Как правило, вам нужно сохранять состояние и выходить из цикла, только если вы нажмете «1»

my %hash_array1=(A=>2,B=>2,C=>2);
my @array2=values (%hash_array1);
my $state = 0;

foreach my $line (@array2) 
{
    if ($line == 1)
    {
        $state = 1;
        last;
    }
}

if ($state == 1)
{
    print BOLD RED "Evolution \n",RESET;
}
else
{
    print BOLD GREEN "\rNo Evolution ",RESET;
}
0 голосов
/ 29 августа 2011

Я бы использовал что-то вроде:

#!/usr/bin/perl
my %hash_array1=(A=>1,B=>1,C=>2);
my $values = join('', values(%hash_array1));

if ($values =~ /1/) {
    print "at least one 1";
} else {
    print "no 1";
}
...