// To detect whether a circular loop exists in a linked list
public boolean findCircularLoop() {
Node slower, faster;
slower = head;
faster = head.next; // start faster one node ahead
while (true) {
// if the faster pointer encounters a NULL element
if (faster == null || faster.next == null)
return false;
// if faster pointer ever equals slower or faster's next
// pointer is ever equal to slower then it's a circular list
else if (slower == faster || slower == faster.next)
return true;
else {
// advance the pointers
slower = slower.next;
faster = faster.next.next;
}
}
}
Вы установили разделитель записи на \n>
. Это не относится к первой последовательности.
Фиксированная кодовая последовательность:
...
chomp $seq;
# for first sequence
$seq =~ s/^>//;
my ($id) = $seq =~ /^(\S+)/;
if ($id eq $lookup) {
...
Обратите внимание, что ваша реализация крайне неэффективна, поскольку она читает & amp; анализирует содержимое файла для каждого запроса. Как насчет разделения загрузки / разбора и запросов на отдельные функции?
Альтернативное решение: предоставить загрузчику полный список значений поиска. Затем он заполнил бы массив ответов при обнаружении совпадений во время чтения файла.
$/
- это разделитель входной записи, настройка local $/="\n>";
заключается в том, что вход разбивается на запись, заканчивающуюся \n>
, после chomp окончание удаляется, однако />*(\S+)/
может не совпадать, так как >
используется из предыдущей записи.
из FASTA wikipedia строка, начинающаяся с >
, является комментарием и не всегда может быть идентификатором. Однако в случае, если это всегда так, следующее может исправить.
my ($id,$seq) = $seq =~ /^>*(.*)\n(\S+)/;