在perl中创建多个临时文件

时间:2012-01-05 12:05:59

标签: perl

如何在perl中创建6(6)个临时文件并获取调用`system()的名称?

我想优化这个伪代码:

my $TEMP0 = new File::Temp( UNLINK => 0 );
system("PROGRAM0 --output $TEMP0");
my $TEMP1 = new File::Temp( UNLINK => 0 );
system("PROGRAM1 --input $TEMP0 --output $TEMP1");
my $TEMP2 = new File::Temp( UNLINK => 0 );
system("PROGRAM2 --input $TEMP0 --output $TEMP2");
my $TEMP3 = new File::Temp( UNLINK => 0 );
system("PROGRAM3 --input $TEMP1 $TEMP2 --output $TEMP3");
my $TEMP4 = new File::Temp( UNLINK => 0 );
system("PROGRAM4 --input $TEMP3 --output $TEMP4");
my $TEMP5 = new File::Temp( UNLINK => 0 );
system("PROGRAM4 --input $TEMP4 --output $TEMP5");

最后取消链接所有的临时文件:

unlink($TEMP0);
unlink($TEMP1);
unlink($TEMP2);
unlink($TEMP3);
unlink($TEMP4);
unlink($TEMP5);

3 个答案:

答案 0 :(得分:4)

您可以使用带有范围的地图来生成临时文件。例如

my @tempfiles = map { new File::Temp( UNLINK => 0 ) } 1..6;

由于程序的调用方式没有固定的模式,将它们作为单独的系统调用保持合理似乎是合理的。

答案 1 :(得分:2)

这应该可以正常工作,只需保持@tempfiles,直到您希望文件取消关联。

my @tempfiles = map {
  File::Temp->new( UNLINK => 1, use_exlock => 0 );
} 0..5;

system("PROGRAM0 --output $tempfile[0]");
system("PROGRAM1 --input $tempfile[0] --output $tempfile[1]");
system("PROGRAM2 --input $tempfile[0] --output $tempfile[2]");
system("PROGRAM3 --input $tempfile[1] $tempfile[2] --output $tempfile[3]");
system("PROGRAM4 --input $tempfile[3] --output $tempfile[4]");
system("PROGRAM4 --input $tempfile[4] --output $tempfile[5]");

...

undef @tempfiles; # unlink all

如果文件与某个内部名称相关联实际上更有意义,请按以下方式编写:

my %tempfiles = map{
  $_ => File::Temp->new( UNLINK => 1, use_exlock => 0 );
} qw'zero one two three four five';


system("PROGRAM0 --output $tempfile{zero}");
system("PROGRAM1 --input $tempfile{zero} --output $tempfile{one}");
system("PROGRAM2 --input $tempfile{zero} --output $tempfile{two}");
system("PROGRAM3 --input $tempfile{one} $tempfile{two} --output $tempfile{three}");
system("PROGRAM4 --input $tempfile{three} --output $tempfile{four}");
system("PROGRAM4 --input $tempfile{four} --output $tempfile{five}");

...

undef %tempfiles; # unlink all

答案 2 :(得分:-1)

my @tempfiles = map { new File::Temp( UNLINK => 0 ) } 1 .. 6;

system("PROGRAM0 --output $tempfiles[0]");

for ( my $i = 1 ; $i <= $#tempfiles ; $i++ ) {
    system( "PROGRAM0 --output ", $tempfiles[$i], " --input ", $tempfiles[ $i - 1 ] );
}

unlink(@tempfiles);