在实际写入文本行之前,如何延迟创建文本文件? (懒惰创作)

时间:2011-12-15 11:38:58

标签: perl file

我有一个在文件上附加文本的perl脚本:

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

在打开一个空文件的那一刻,我想避免这个。我希望只有在第一次将一行写入文件句柄时才会创建该文件:

print EXFILE $line 

如果没有任何内容写入文件句柄,则不应创建文件...

有可能吗?怎么样?

3 个答案:

答案 0 :(得分:6)

创建一个为您开放的子。

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 :(得分:1)

我在想,当文件即将被销毁时,最简单的对象会打印到文件中。

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

答案 2 :(得分:1)

这样的事情怎么样:

#!/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。没有测试,但应该工作