2014-01-22 2 views
0

database.Win.txt - это файл, содержащий несколько строк. Вторая из каждых трех строк - это число. Код должен печатать три строки (в новом порядке) на одной строке, разделенные вкладками, но только если вторая строка равна 1.Правильное использование входного файла в perl?

Я по этому коду фактически получаю цикл для создания массив с тремя строками database.Win.txt каждый раз, когда он проходит через цикл? Это моя цель, но я подозреваю, что это не то, что делает код, так как я получаю сообщение о том, что функция int() ожидает числовое значение и не находит его.

while(<database.Win.txt>){ 
    $new_entry[0] = <database.Win.txt>; 
    $new_entry[1] = <database.Win.txt>; 
    $new_entry[2] = <database.Win.txt>; 
    if(int($new_entry[1]) == 1) { 
     chomp($new_entry); 
     print "$new_entry[1], \t $new_entry[2], \t $new_entry[0], \n" 
    } 
} 

Я начинаю с Perl. Пожалуйста, объясните как можно проще!

ответ

0

Я думаю, что у вас есть хорошее начало в решении. Тем не менее, ваш while читает одну строку прямо перед чтением следующих трех строк (если они были <$file_handles>). int не требуется, но chomp есть - перед тем, как вы проверите значение $new_entry[1], еще есть разделитель записей в конце.

Учитывая это, необходимо учитывать следующее:

use strict; 
use warnings; 

my @entries; 
open my $fh, '<', 'database.Win.txt' or die $!; 

while (1) { 
    last if eof $fh; 
    chomp($entries[$_] = <$fh>) for 0 .. 2; 

    if ($entries[1] == 1) { 
     print +(join "\t", @entries), "\n"; 
    } 
} 

close $fh; 

Всегда начинайте с use strict; use warnings. Затем откройте файл, используя three-argument formopen. Здесь используется while (1), поэтому три строки за один раз можно прочитать в цикле while. Поскольку это «бесконечный» цикл while, выход last if eof $fh; дает выход, а именно: если следующий прочитанный файл создает конец файла, это last. Прямо ниже это цикл for, который эффективно выполняет то, что вы сделали: назначьте строку файла позиции массива. Обратите внимание, что chomp используется для удаления разделителя записей во время назначения. Последняя часть также похожа на вашу, так как она проверяет, является ли вторая из трех строк равной 1, а затем строка печатается, если она есть.

Надеюсь, это поможет!

Смежные вопросы