2012-06-05 3 views
0

Я знаю, как работает поиск в целом, и посмотрел на несколько других сообщений. Однако я все еще смущен. Как Иск работает точно, будет ли он читать с той же позиции, на которой он остановился?perl while loops

while(my $line= <IN1>) 
{ 
    do something; 
    while(my $l= <IN2>) 
    { 
    do something; 
    seek IN1, 0, 1; 
    } 
} 

Будет ли это возвращаться к первому циклу и начинаться с того места, где оно остановилось ...? , а затем, если он вернется ко второму циклу, как я могу его прочитать, откуда он остановился ...?

+3

Обычно лучше загружать файл в память, а не читать его снова и снова. – ikegami

+1

Большую часть времени, когда вы думаете, что вам нужно «искать», вы этого не делаете. Так почему бы не спросить о том, что вы пытаетесь решить вместо этого? – TLP

+1

этот фрагмент кода выглядит ужасно. поиск в цикле while с константами в файле, который не затрагивается в цикле? Вы в конечном итоге перемещаетесь в один и тот же байт сотни раз, не читая. – kratenko

ответ

3

Нет, он никуда не денется. Это seek не является оператором, потому что, согласно seek documentation, вы эффективно говорите ему «переместить 0 байт из текущей позиции». Если вам нужно отметить свою позицию в файле, а затем возобновить ее, вам необходимо получить ее с tell, а затем seek с WHENCE, установленным на SEEK_SET (0).

Пример:

use Fntl qw(SEEK_SET); # <- he knows exactly what SEEK_SET is on your system, though it is always 0, AFAIR. 
     
my $current_position = tell $file_handle; 
do_stuff_with_data_from(<$file_handle>); 
do_more_stuff_with_data_from(<$file_handle>); 
# rewind 
seek $fh, $current_position, SEEK_SET; 
+0

не могли бы вы привести пример ... того, как я буду это делать, поскольку я столько часов борюсь с этим. – A14

+2

Здесь вы идете. Хотя я думаю, что вы по-прежнему работаете над двумя сравнениями файлов, что лучше сделать по-другому. –

2

Ручки собирается «вернуться», откуда они остановились в первую очередь, до тех пор, пока вы не открывать или закрывать их в петлю - и дон «т.

Если то, что вы хотите сделать, это остановить чтение со второго входа и прочитать с первого, тогда вы просто хотите выйти из внутреннего цикла. Поскольку вы не закрыли или не перезапустили IN2, он должен быть готов прочитать запись после того, как вы прочли ранее.

RCD_FROM_1: 
while(my $line= <IN1>) 
{ 
    do something; 
    RCD_FROM_2: 
    while(my $l= <IN2>) 
    { 
    do something; 
    last RCD_FROM_2 if some_condition(); 
    } 
} 

Вы также могли бы сделать что next RCD_FROM_1;

Если вы хотите, чтобы иметь возможность перечитать строки, то вы можете сделать записать tell в конце каждого цикла, так что вы можете перемотать и прочитать, что запись снова.

my $prev = 0; 
RCD_FROM_1: 
while(my $line= <IN1>) 
{  
    ... 

    $prev = tell(IN2); 
    RCD_FROM_2: 
    while(my $l= <IN2>) 
    { 
    do something; 
    if (some_condition()) { 
     die 'Could not reset handle' unless seek(IN2, $prev, 0); 
     last RCD_FROM_2; 
    } 
    $prev = tell(IN2); 
    } 

Я, вероятно, скорее всего буду буферировать последнюю запись обоих потоков локально.

+0

Я бы не сказал «собираюсь вернуться». Они на самом деле просто «никуда не двигаются». –

+0

Спасибо, что ... Я думаю, что я делаю что-то неправильно, потому что петля выхода выходит на следующую итерацию, но все равно сравнивает ее с тем же значением внутреннего цикла. необходимо вырваться из внутреннего цикла, перейти к следующей итерации внешнего цикла и следующей итерации внутреннего цикла. – A14

+0

не могли бы вы объяснить, что вы там сделали ... Я полностью потерял – A14

2

Я думаю, что вы сбиты с толку от моего ответа на ваш previous question, который использовал seek, чтобы перемотать файл и прочитать его с самого начала.

Perl's seek не имеет отношения к while петлям. Он просто устанавливает позицию в файле, где будут считываться следующие данные. Я использовал его в своем решении, чтобы вернуть точку считывания в начало файла после того, как он был полностью прочитан.

Для нас, чтобы помочь вам лучше всего, вы должны перефразировать свой вопрос и включить подробную информацию о том, что вы действительно пытаетесь сделать. В настоящее время, насколько я понимаю, это так.

У вас есть два файла, каждый с четырьмя строчными записями, которые имеют последовательность ДНК во второй строке. Вам нужен список всех последовательностей ДНК, которые отображаются в любом месте в и файлах, а также список тех последовательностей, которые находятся только в одном файле или другом.

Правильно ли это, пожалуйста, поднимите новый вопрос, который подробно объяснит вашу проблему. Вы пошли за конкретным решением, которое не решит вашу проблему, и попросил помощи, чтобы он работал.Если вы сообщите нам о проблеме вместо предлагаемого вами решения, мы сможем помочь вам намного лучше и не будем делать догадки об истинной ситуации.

+0

Большое вам спасибо за помощь :) Я получаю его сейчас – A14