Вы не хотите откладывать открытие файла, если вы откладываете открытие любых проблем, таких как ошибка разрешения, или отсутствующий каталог в пути к файлу приведет к сбою программы при первом операторе печати.Принимая во внимание тот факт, что у вас могут быть запуски программ, которые никогда не будут печатать что-либо, что вы, вероятно, столкнетесь с ошибкой вашей программы в какое-то случайное время в будущем, потому что она просто выполнила печать в файл, который не мог открыться месяцами.К тому времени вы или ваш преемник, возможно, уже забыли, что эта функция когда-либо существовала.
Гораздо лучше проверить файл после того, как вы сделали, чтобы убедиться, что он пуст, и удалить его, если он есть.Вы можете заключить логику в класс, если хотите сделать это за вас.
package My::File;
use strict;
use warnings;
use base qw(IO::File);
sub new {
my ($class, $file, @args) = @_;
my $self = $class->SUPER::new($file, @args);
if ($self) {
*{$self}->{file} = $file;
}
return $self;
}
sub DESTROY {
local $@;
my ($self) = @_;
$self->flush;
if (-e *{$self}->{file} && -z *{$self}->{file}) {
unlink *{$self}->{file};
}
return;
}
package main;
my $fh1 = My::File->new("file_1", "w");
my $fh2 = My::File->new("file_2", "w");
print $fh1 "This file should stay\n";
Этот код на самом деле не готов к работе, он не пытается обрабатывать все способы, которыми может быть IO::File->new()
call, и он также должен переопределять вызовы на $file_obj->open()
аналогично new
.Это также можно сделать с лучшей обработкой ошибок.