я дал р. Bemrose мой голос, но если $ fh это FILE HANDLE , вы можете также close
его до завершения.
Кроме того, вы используете printf
неправильно. printf это , а не 'файл печати'. его «формат печати».
Для этого последнего примера
print $fh 'Message' ;
Это все, что вам нужно.
printf
предназначен для использования таким образом:
printf $fh 'some format %s and more %s ' , $var , $var ;
или
printf 'some format %s and more %s ' , $var , $var ;
и его эквивилант к выполнению
print $fh sprintf 'format %s more %s' , $var , $var ;
И из-за этого вы рискуете ненужным кодом в случае, если какая-либо из ваших объединенных переменных будет расширена до «%». Пример людей, попавших в эту ловушку, см. Q: 308417: Почему мой Perl-скрипт удаляет символы из файла?
perldoc -f print
print FILEHANDLE LIST
print LIST
print Prints a string or a list of strings.
perldoc -f printf
printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\"
(the output record separator) is not appended
Дальнейшие исследования
Я продолжал исследовать вашу проблему, потому что не могу получить ваше состояние "буферизации". Все мои файлы правильно очищены, независимо от того, очищаю я их или нет. (Perl 5.10).
Вот мой фрагмент кода, который я пытаюсь:
#!/usr/bin/perl
use strict;
use warnings;
open my $fh , '>' , '/tmp/oo.txt';
my $exit_at = int(rand( 200_000 ));
print "$exit_at\n";
sleep 2;
for ( 0 .. ( $exit_at * 2 ) ){
print $fh $_;
if ( $_ == $exit_at ){
printf $fh '%n' ; # Bad Code Causes Early Death.
printf $fh 'last line';
exit;
}
if ( $_ % 1000 ){
print $fh "\n";
}
}
Я использую ваше неправильное использование printf.
Закомментированная строка выводит сообщение об ошибке, потому что оно недопустимо из-за того, что никто не предоставил параметр 'n', и умирает с:
Modification of a read-only value attempted at iotest.pl line 15.
Перед выполнением печати «последней строки» (тоже плохо, но в ней нет символов%, так что все в порядке), так как «последняя строка» отсутствует в выходном файле.
Пожалуйста, исправьте ваш printf и используйте вместо него обычный старый принт и посмотрите, решит ли это вашу проблему.