如何在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);
答案 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);