Цикл Perl с использованием read () - PullRequest
0 голосов
/ 01 сентября 2018

Я хочу прочитать текстовый файл data.txt, используя read. Я хотел бы прочитать первые четыре целых числа каждой строки за один раз.

data.txt

line1 0101020102
line2 2010201001
line3 0201010201

line1 и т. Д. Являются частью файла.

Это то, что я мог сделать до сих пор

Perl

my $data;
my $IN;
my $n = 0;

$line = 1;

open($IN, '<', "data.txt") or die " Error";

while ( $line != 0 ) {
    seek($IN, 6, SEEK_SET);
    $line = read($IN, $data, 4);
    seek($IN, 0, SEEK_SET);
}

Проблема в том, что при использовании этого цикла while Perl продолжает читать первую строку в бесконечном цикле.

Как мне справиться с этой проблемой?

1 Ответ

0 голосов
/ 01 сентября 2018

Я думаю, вы неправильно понимаете, что делает seek(). При SEEK_SET в качестве третьего параметра второй параметр интерпретируется как позиция, в которую необходимо переместиться, как измерено от начала файла. Поэтому каждый раз, когда вы запускаете эту строку:

seek($IN, 6, SEEK_SET);

Он всегда перемещается на седьмую позицию в файле (которая, очевидно, всегда находится на одной строке). Затем, когда вы запустите эту строку:

seek($IN, 0, SEEK_SET);

Всегда возвращается к началу файла.

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

seek($IN, 6, SEEK_CUR); # Move forward six spaces
$line = read($IN, $data, 4);
seek($IN, 7, SEEK_CUR); # Move forward seven places

Но на самом деле регулярное выражение - лучший подход здесь.

while(<$IN>) {
    ($data) = /\s(\d{4})/;
    print "$data\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...