我有一个在文件上附加文本的perl脚本:
open (EXFILE, ">>$outFile");
在打开一个空文件的那一刻,我想避免这个。我希望只有在第一次将一行写入文件句柄时才会创建该文件:
print EXFILE $line
如果没有任何内容写入文件句柄,则不应创建文件...
有可能吗?怎么样?
答案 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。没有测试,但应该工作