Perl: чтение из файла
От: Аноним  
Дата: 04.02.09 07:15
Оценка:
Здравствуйте.
Имеется вот такой код на Perl (Perl 5.10), который читает файл по строкам и чего-то там с ним делает:
open my $handle, "<","$filename" or die;
my $lineno = 1;
for (;;) {
        undef $!;
        my $line = <$handle>;
        die $! if $!;#почему-то тут происходит сбой с диагнозом "Bad file descriptor"
        # здесь обработка строки
        ......................
        $lineno++;  
}

Просто тупо взял из документации и доработал для своих целей. Но вот в одном месте (см. листинг) происходит сбой — скрипт вылетает с сообщением "Bad file descriptor". Если там закомментировать — все отлично работает. Не пойму, в чем дело.
З.Ы. Уважаемые любители по каждому поводу флеймить "Ты сам тупой, читай доки или ВОН ИЗ ПРОФЕССИИ!" — верите, нет, надоели. Доки я первым делом стал читать и объяснения не нашел. Если можете в двух словах объяснить или дать ссылку на документ — буду рад, если нет — пожалуйста, не разводите оффтоп. Благодарю за понимание.
Re: Perl: чтение из файла
От: Аноним  
Дата: 04.02.09 07:36
Оценка:
Да, забыл добавить, при обработке строки сразу идет:
last unless (defined($line));

чтобы, понятное дело, выйти из цикла когда весь файл просмотрен.
Re: Perl: чтение из файла
От: e_k Россия  
Дата: 04.02.09 08:54
Оценка: 5 (1)
https://bugzilla.redhat.com/show_bug.cgi?id=221113#c0
Re[2]: Perl: чтение из файла
От: Аноним  
Дата: 04.02.09 11:41
Оценка:
Спасибо. То есть, по-видимому, правильного решения нет? И надо тупо забить на проверку после чтения строки?
Re[3]: Perl: чтение из файла
От: anonymous Россия http://denis.ibaev.name/
Дата: 04.02.09 11:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо. То есть, по-видимому, правильного решения нет? И надо тупо забить на проверку после чтения строки?


Нет, правильное решение — подобрать значения переменных окружения PERLIO и CHUNKSIZE.
Re[4]: Perl: чтение из файла
От: Аноним  
Дата: 04.02.09 11:51
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Нет, правильное решение — подобрать значения переменных окружения PERLIO и CHUNKSIZE.


По ссылке сообщается, что

it does not show the bugs with PERLIO=stdio

ИМХО, это хак. Или в этом присвоении есть какой-то смысл?
Re[4]: Perl: чтение из файла
От: Аноним  
Дата: 04.02.09 12:02
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Нет, правильное решение — подобрать значения переменных окружения PERLIO и CHUNKSIZE.


У меня Win, и вообще нет такой переменной окружения PERLIO. Во всяком случае консольная команда set ее не распознает.
Re[5]: Perl: чтение из файла
От: anonymous Россия http://denis.ibaev.name/
Дата: 04.02.09 12:14
Оценка:
Здравствуйте, Аноним, Вы писали:

A>>Нет, правильное решение — подобрать значения переменных окружения PERLIO и CHUNKSIZE.

А>У меня Win, и вообще нет такой переменной окружения PERLIO. Во всяком случае консольная команда set ее не распознает.

Я не разбирался подробно, но там какая-то ошибка в PerlIO layers. И игры с PERLIO — можно признать хаком.

Переменную окружения нужно устанавливать самому. У меня для ActiveState Perl 5.10.0 заработало PERLIO=perlio. Можно сделать это при открытии файла функцией open().

Почитать:
http://search.cpan.org/perldoc?perlrun#PERLIO
http://search.cpan.org/perldoc?PerlIO
Re[6]: Perl: чтение из файла
От: Аноним  
Дата: 04.02.09 12:27
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Переменную окружения нужно устанавливать самому. У меня для ActiveState Perl 5.10.0 заработало PERLIO=perlio. Можно сделать это при открытии файла функцией open().


A>Почитать:

A>http://search.cpan.org/perldoc?perlrun#PERLIO
A>http://search.cpan.org/perldoc?PerlIO

OK, спасибо. Вот еще вопросик: хочу проверить процедуру, которая обрабатывает текстовый файл. Читал, что можно использовать секцию DATA, как встроенный в исходник с тестами файл. Если я пишу:
my $x=<DATA>;

это срабатывает, но если вот так:
sub scan_file {
my $handle = shift;
for (;;) {
        my $line = <$handle>;
# построчная обработка
.....
}

ok(scan_file(DATA),'result=0');

То вылетает с ошибкой: Bareword "DATA" not allowed while "strict subs" in use
А как сделать? Использовать отдельный тестовый файл? Или есть какой-то способ?
Re[7]: Perl: чтение из файла
От: anonymous Россия http://denis.ibaev.name/
Дата: 04.02.09 14:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>То вылетает с ошибкой: Bareword "DATA" not allowed while "strict subs" in use

А>А как сделать? Использовать отдельный тестовый файл? Или есть какой-то способ?

В кавычки слово DATA.
Re[8]: Perl: чтение из файла
От: Аноним  
Дата: 04.02.09 15:19
Оценка:
Здравствуйте, anonymous, Вы писали:

A>В кавычки слово DATA.


Все заработало. Хотя и не понимаю, почему — в туториалах такие вещи не пишут, а если пишут, то фиг еще найдешь. Я например не мог найти. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.