Как мне отложить создание текстового файла, пока я не напишу в нем строку?(ленивое создание) - PullRequest
4 голосов
/ 15 декабря 2011

У меня есть скрипт на Perl, который добавляет текст в файл:

open (EXFILE, ">>$outFile");

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

print EXFILE $line 

Если в дескриптор файла ничего не записано, файл создавать не следует ...

Возможно ли это? Как?

Ответы [ 3 ]

6 голосов
/ 15 декабря 2011

Создайте саб, который сделает открытие за вас.

sub myappend {
    my ($fname, @args) = @_;
    open my $fh, '>>', $fname or die $!;
    print $fh @args;
    close $fh or die $!;
}

myappend($outfile, $line);

Либо вместо печати нажмите на массив и дождитесь окончания печати. ​​

while ( ... ) {
    push @print, $line;
}

if (@print) {
    open my $fh, '>>', $outfile or die $!;
    print $fh @print;
}

Или, для нескольких файлов

while ( ... ) {
    push @{$print{$outfile}}, $line;
}

for my $key (%print) {
    open my $fh, '>>', $key or die $!;
    print $fh @{$print{$key}};
}
1 голос
/ 05 января 2012

Как насчет этого:

#!/usr/bin/env perl

use strict;
use warnings;

my $fh;

sub myprint {
  unless ($fh) {
    open $fh, '>', 'filename';
  }
  print $fh @_;
}

myprint "Stuff"; # opens handle and prints
myprint "More stuff"; # prints

N.B. не проверено, но должно работать

1 голос
/ 05 января 2012

Я думал, что будет самым простым объектом, который будет распечатан в файл, когда он собирается быть уничтоженным.

package My::Append; use strict; use warnings;

sub new {
  my($class,$filename) = @_;
  my $self = bless {
    filename => $filename,
  }, $class;
  return $self;
}

sub append{
  my $self = shift;
  push @{ $self->{elem} }, @_;
  return scalar @_;
}

sub append_line{
  my $self = shift;
  push @{ $self->{elem} }, map { "$_\n" } @_;
  return scalar @_;
}

sub filename{
  my($self) = @_;
  return $self->{filename};
}

sub DESTROY{
  my($self) = @_;
  open my $fh, '>>', $self->filename or die $!;
  print {$fh} $_ for @{ $self->{elem} };
  close $fh or die $!;
}

Используется так:

{
  my $app = My::Append->new('test.out');
  $app->append_line(qw'one two three');
} # writes to file here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...