LINUX.ORG.RU

[perl] запись в файл после чтения из него

 


0

0
open FHWRITE, ">> $moddir/file.lst";
open FHREAD, "< $moddir/file.lst";
print FHWRITE "ололо!\n";
while (<FHREAD>) {
print $_;
}

у меня в скрипте один файл открывается в двух дескрипторах - один для записи с добавлением, другой для чтения. сначала происходит запись в этот файл через дескриптор записи, потом читается какая-либо строка из него через дескриптор чтения. при повторении во время записи возникает ошибка и скрипт вылетает:

Use of uninitialized value in subroutine entry at ./script.pl line 328, <FHREAD> line 32.
Undefined subroutine &main:: called at ./script.pl line 328, <FHREAD> line 32.
второй номер линии (32) зависит от количества строк в файле. :(


perldoc -f open:

               You can put a '+' in front of the '>' or '<' to indicate that you want both read and write access to the file; thus '+<' is almost always
               preferred for read/write updates--the '+>' mode would clobber the file first.

Не подходит?

AITap ★★★★★
()
Ответ на: комментарий от AITap

я конечно хотел попробовать, но:

you almost never want to use +> or +>>. The first clobbers your file before you can read it, and the second one is confusing because your read pointer can be anywhere, but on many systems, the writer always jumps to the end of the file.

AlxQ
() автор топика
Ответ на: комментарий от iSage

а в чём особенность IO::File? чем он отличается от open (stdio)?

AlxQ
() автор топика
Ответ на: комментарий от AITap

код теперь такой:

open FH, "+< $moddir/file.lst"; 
print FH "ололо!\n"; 
while (<FH>) { 
print $_; 
}
Ошибка та же:
Use of uninitialized value in subroutine entry at ./script.pl line 328, <FH> line 33.
Undefined subroutine &main:: called at ./script.pl line 328, <FH> line 33.

AlxQ
() автор топика
Ответ на: комментарий от AlxQ

Этот код у меня работает. Так что что-то не так у тебя.

Вот только смысла он не имеет.

  • во-первых он затрет содержимое файла
  • после print курсор будет стоять в конце файла. Т.е. читать будет нечего.

IO::File просто удобней.

fenrirko ~ # cat test.pl
#!/usr/bin/perl -w
use strict;
use warnings;
use IO::File;

my $fh = new IO::File("file.lst", O_RDWR|O_APPEND);
if (defined $fh)
{
    print $fh "ололо2\n";
    $fh->seek ( 0, SEEK_SET );
    while (!$fh->eof())
    {
        print $fh->getline;
    }
    $fh->close();
}
fenrirko ~ # cat file.lst
ололо!
ололо1
fenrirko ~ # ./test.pl
ололо!
ололо1
ололо2
fenrirko ~ # cat file.lst
ололо!
ололо1
ололо2
fenrirko ~ #

iSage ★★★★
()
Ответ на: комментарий от iSage

а попробуйте мой код выполнить в цикле несколько раз.. у меня на второй раз возникает эта ошибка

AlxQ
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.