使用File :: Temp模块

时间:2018-03-15 11:10:13

标签: perl

在perl中探索File :: Temp模块时,我发现它在退出时没有删除文件。

我正在创建临时文件并将该文件传递给其中打开文件进行读写的其他函数 这是代码:

#!/usr/bin/perl  
use strict ;  
use warnings ;  
use Data::Dumper;   
use File::Temp qw/ tempfile tempdir /;  
use sigtrap qw(die normal-signals error-signals);  

sub temp{  
    my $decrypted_file_path = "/home/programming/perl";  
    my $file = new File::Temp(DIR => $decrypted_file_path, SUFFIX => '.tmp',UNLINK=>1)->filename;  
    print Dumper $file;  
    writeFile($file);  
    my @arr = parse($file);  
    return ;  
}  

sub writeFile{  
   my ($file) = @_ ;  
   print $file ;  
   open(my $fh,'>', $file) or die "cannot open : $!";  
   print $fh 'this is test' ;  
   close $fh ;    
}  

sub parse{  
    my ($file) = @_ ;  
    open(my $fh,'<', $file) or die "cannot open : $!";  
    my @arr = <$fh> ;  
    close $fh ;  
    return @arr ;  
}  

temp();  

问题是当程序终止时,文件仍然存在。如何自动删除文件,实现此功能的正确方法是什么。

Perl版本使用:v5.10.1

3 个答案:

答案 0 :(得分:5)

您使用的是File::Temp错误的方法。 它已经为您提供了一个包含文件句柄和文件名的对象。 如果你这样做

my $filename = new File::Temp(...)->filename;

然后将立即销毁包含文件句柄的File :: Temp返回的对象。它类似于:

my $file = new File::Temp(...);
my $filename = $file->filename;
undef $file;

因此它会创建一个文件并直接将其删除,剩下的就是文件名。然后你自己打开这个文件,永远不要删除它。

使用它:

my $temp = File::Temp->new(...);
# is already a filehandle
print $temp $content;
# explicitly remove it, otherwise it will be removed when it falls out of scope
undef $temp;

答案 1 :(得分:2)

我在版本5.16.3上观察到相同的行为。在同一行使用newfilename对我来说很奇怪。如果我将这两个函数分开,则会自动删除该文件:

my $tmp = File::Temp->new(DIR => $decrypted_file_path, SUFFIX => '.tmp', UNLINK => 1);
my $file = $tmp->filename();

答案 2 :(得分:1)

使用选项CLEANUP => 1。 请参阅documentation

中的详情