Как я могу переписать это условие множественного ИЛИ, чтобы оно использовало цикл Perl "for"? - PullRequest
2 голосов
/ 13 апреля 2011

У меня есть жестко запрограммированные циклы if, которые выглядят следующим образом:

my $tp = 0;
my $fp = 0;
if (   $myhash{$pred}
        || $myhash{$pred1}
        || $myhash{$pred2}
        || $myhash{$pred3}
        || $myhash{$pred4}
        || $myhash{$pred5}
        || $myhash{$pred6} )
    {
        $tp++;
    }
    else {
        $fp++;
    }

Как мне это сделать для циклов?

Я пробовал следующее, но это дает другой результатвсего fp и tp:

my $tp=0;
my $fp=0;

my @allpreds = ($pred,$pred1,$pred2,$pred3,$pred4,$pred5);

foreach my $allpred ( @allpreds ) {
        if ( $myhash{$allpred} ) {
            $tp++;

        }

    }
if ( !myhash{$pred} ) {
        $fp++;
    }

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011
my $tp=0;
my $fp=0;
my $count=0;

my @allpreds = ($pred,$pred1,$pred2,$pred3,$pred4,$pred5);

foreach my $allpred ( @allpreds ) {
        if ( $myhash{$allpred} ) {
            $count++;

        }

    }

if ($count>0) { $tp=1; } else { $fp=1; }
1 голос
/ 13 апреля 2011

grep вернет истинное значение, когда любой один или несколько его входов вернут истину для своего оператора, в основном позволяя ему действовать как цепочка операторов || ', за исключением того, что он не будет закорачиваться.

my @allpreds = ($pred, $pred1, $pred2, $pred3, $pred4, $pred5, $pred6);
if (grep { $myhash{$_} } @allpreds) {
    $tp++;
}
else {
    $fp++;
}

Использование grep таким способом может быть немного запутанным, поэтому более явным способом является использование List :: MoreUtils any

use List::MoreUtils qw(any);
my @allpreds = ($pred, $pred1, $pred2, $pred3, $pred4, $pred5, $pred6);
if (any { $myhash{$_} } @allpreds) {
    $tp++;
}
else {
    $fp++;
}
1 голос
/ 13 апреля 2011

Это несколько компактнее, чем некоторые ответы, но полностью эквивалентно.

my $tp = 0;
my $fp = 0;

foreach my $allpred ($pred, $pred1, $pred2, $pred3, $pred4, $pred5)
{
    $tp++, last if ($myhash{$allpred});
}

$fp = !$tp;

Не ясно, что переменная $fp зарабатывает свое сохранение, когда !$tp почти так же просто написать.


Код теста - измените настройки RHS жирных запятых, чтобы изменить поведение теста.

use strict;
use warnings;

my $pred   = "";
my $pred1  = "1";
my $pred2  = "2 2";
my $pred3  = "3 3 3";
my $pred4  = "4 4 4 4";
my $pred5  = "5 5 5 5 5";
my %myhash = ( $pred1 => 0, $pred2 => 0, $pred3 => 0, $pred4 => 0, $pred5 => 1 );

my $tp = 0;
my $fp = 0;

foreach my $allpred ($pred, $pred1, $pred2, $pred3, $pred4, $pred5)
{
    $tp++, last if ($myhash{$allpred});
}

$fp = !$tp;

printf "%d:%d\n", $tp, $fp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...