Проблемы с чтением файла в массиве по номеру строки в Perl - PullRequest
0 голосов
/ 19 декабря 2010

Я работаю с двумя файлами, поэтому, когда я зацикливаюсь на одном, мне нужно просмотреть часть другого, и информация, с которой я столкнусь в нем, будет последовательной.Поэтому я подумал, что лучшим способом будет отслеживать номер строки: <br> open(PARSED, "< file.txt") or die$!;<br> my @parsedFile = < PARSED >;<br> my $line = 0;<br> my $size = @parsedFile;<br> # This next part is in a loop, but the only important thing is this next line<br> print $parsedFile[$line];

Даже если значение $ line увеличивается, оно ничего не печатает, но если я сделаю следующее, проблем не будет: <br> foreach (@parsedFile){ print $_; }<br> Я даже пробовал несколько вариантов, пытаясь извлечь отдельные строки из @parsedFile, но безуспешно.

Ответы [ 3 ]

7 голосов
/ 19 декабря 2010

<> - невероятно разборчивый оператор, который делает две совершенно разные вещи, основываясь исключительно на точном синтаксисе того, что в скобках.< PARSED > (с дополнительными пробелами) является glob ("PARSED"), а не readline (PARSED), поэтому ваш массив просто получает единственную строку "PARSED".

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

Обратите внимание, что:

use warnings;
open(PARSED, "< filename") or die $!;
my @lines = < PARSED >;

предупредит вас, что PARSED используется только один раз, что является большой подсказкой о том, что <> не делает то, что вы думаете.

1 голос
/ 19 декабря 2010

Первоначальная проблема была исправлена ​​ysth, но если файлы не очень большие (вы читаете их в память, так что я не думаю), почему бы не использовать Tie :: File вместо все эти махинации?

use strict;
use warnings;
use 5.010;
use Tie::File;

tie my @parsedFile, 'Tie::File', 'file.txt' or die "Error: $!";

my $line = 0;
print $parsedFile[$line];
0 голосов
/ 19 декабря 2010

Чтобы загрузить строки файла в массиве, сначала нужно открыть файл:

open F,'<','file.txt' or die;
my @parsedFile = <F>;

То, как вы это делаете, приводит к массиву parsedFile, который содержит только один элемент "file.txt", который является именем файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...