Perl добавление вопросов - PullRequest
0 голосов
/ 04 мая 2011

У меня есть код, который добавляется в некоторые файлы во вложенных циклах for. После выхода из цикла for я хочу добавить .end ко всем файлам.

foreach my $file (@SPICE_FILES)
{
    open(FILE1, ">>$file") or die "[ERROR $0] cannot append to file : $file\n";
    print FILE1 "\n.end\n";
    close FILE1; 
}

В некоторых странных случаях я заметил, что ".end" добавляется в середину файлов!

как мне решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 04 мая 2011

Поскольку у меня еще нет права комментировать, я должен написать это как «ответ».

Вы используете какие-нибудь хитрые модули?

Я столкнулся с проблемами, когда (очевидно) сломанные perl-модули сделали что-то для буферизации вывода. Для меня размещение

$| = 1;

в коде помогло. Вышеприведенный оператор отключает буферизацию вывода perls (AFAIK). Это могло бы иметь и другие последствия, но я не видел, чтобы из этого вышло ничего негативного.

1 голос
/ 04 мая 2011

Полагаю, у вас есть данные, буферизованные в некоторых ранее открытых файловых дескрипторах.Попробуйте закрыть их перед повторным открытием:

open my $fd, ">>", $file or die "Can't open $file: $!"; 
print $fd, $data;
close $fd or die "Can't close: $!";

Еще лучше, вы можете добавить эти файловые файлы к массиву / хэшу и записать их в очистку:

push @handles, $fd;
# later
print $_ "\n.end\n" for @handles; 

Вот примервоспроизведите «невозможное» приложение в середине:

 #!/usr/bin/perl -w
 use strict;

 my $file = "file";

 open my $fd, ">>", $file;
 print $fd "begin"; # no \n -- write buffered

 open my $fd2, ">>", $file;
 print $fd2 "\nend\n";
 close $fd2; # file flushed on close

 # program ends here -- $fd finally closed
 # you're left with "end\nbegin"
0 голосов
/ 04 мая 2011

Невозможно добавить что-либо в середину файла. Флаг O_APPEND гарантирует, что каждый системный вызов write (2) поместит свое содержимое в старый EOF и обновит поле st_size, увеличив его на столько байтов, которые вы только что написали.

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

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