нулевое или пустое обнаружение perl - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть хеш, содержащий результаты сопоставления подстрок. Я хочу напечатать сообщение, если между строкой нет совпадений. Я попробовал следующее, и это не сработало.

foreach (keys %d) { 
    if ($_ eq "") {
        print "no matches"; # and i've tried (if defined $_
    } else {
        print "$_\n";
    }
}

% d заполняется таким образом (содержит соответствующие подстроки):

foreach (my $i=0;$i<length($seq1)-$k;$i+=1) { 
    my $common=substr($seq1,$i,$k); 
    if ($seq2=~/$common/) {
        $d{$common}++;
    }
}

Ответы [ 2 ]

6 голосов
/ 15 декабря 2011

Мне кажется, я наконец вижу, чего вы пытаетесь достичь.Вы думаете, что, проверяя, совпадают ли ключи в %d с пустой строкой, в вашем цикле не было совпадений.Это неверноЕсли совпадений нет, то ключей нет, и цикл никогда не будет выполнен.

К сожалению, вы не можете проверить, содержит ли %d значения таким образом.Вам нужно что-то вроде:

unless (%d) { 
    print "No matches\n";
} else {
    print "$_\n" for keys %d;
}
0 голосов
/ 15 декабря 2011

У вас есть итерация по всем существующим ключам и проверьте, является ли строка пустой, я думаю, это не то, что вам нужно.

Попробуйте

if (defined $d{$_})

или если он установлен на "", то

if ($d{$_} eq "")

Чтобы быть более полезным, нужно знать, как заполнен твой хэш.

Вам необходимо также инициализировать несовпадающие значения. В своем коде вы можете добавить

if ($seq2=~/$common/) {
    $d{$common}++;
}
else 
{ $d{$common} = 0 unless (exists($d{common})); }

и затем проверьте

if ($d{$_} > 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...