2013-07-30 34 views
2

我想我已经阅读了如何做到这一点,但我找不到在哪里。也许这只有在新的(ISH)版本的Perl中才有可能。我正在使用5.14.2:perl:打开文件句柄,写入它,稍后给它一个名字?

我有一个Perl脚本,如果满足某些条件,将结果记录到文件中。考虑到脚本的结构来记录结果并稍后检查是否符合将结果保存到文件中的条件,这更符合逻辑。

我想我已经阅读过某处我可以写入内容到一个文件句柄,在Linux中我猜对应的是临时文件或某种管道,然后给这个文件命名,包括目录稍后它应该在哪里。否则,脚本结束时将丢弃内容。

除了在临时文件周围泛起并手动删除它们之外,有没有一种在Perl中直接执行此操作的简单方法?

+3

[File :: Temp](https://metacpan.org/module/File::Temp)也许? – Demnogonis

回答

5

对于您所描述的内容,没有简单的(UNIX)工具,但行为可以由基本系统操作组成。 Perl的File :: Temp已经完成了你想要的大部分功能:

use File:Temp; 

my $tmp = File::Temp->new;  # Will be unlinked at end of program. 

while ($work_to_do) { 
    print $tmp a_lot_of_stuff(); # $tmp is a filehandle 
} 

if ($save_it) { 
    rename($tmp, $new_file);  # $tmp is also a string. Move (rename) the file. 
}        # If you need this to work across filesystems, you 
           # might want to ``use File::Copy qw(move)'' instead. 

exit;       # $tmp will be unlinked here if it was not renamed 
+0

我正在使用'File :: Copy move'。我意识到这种方法存在一个小问题,这是因为我对文件句柄“close”的工作原理不了解。所以我决定设置'$ tmp-> autoflush(1)',然后执行'move($ tmp-> filename,$ new_filename)'。然后我假设我不需要在移动后明确地“关闭”任何东西。 – 719016

1

我使用File :: Temp来做这件事。

但是您应该记住File :: Temp默认会删除该文件。这是好的,但在我的情况下,我不希望在调试时。如果脚本终止并且输出不是所需的,我不能检查临时文件。

所以我更喜欢设置$KEEP_ALL=1$fh->unlink_on_destroy(0);当OO或($fh, $filename) = tempfile($template, UNLINK => 0);,然后自己断开文件链接或移动到适当的位置。

在关闭文件句柄后移动文件会更安全(以防发生缓冲)。所以我宁愿采用一种方法,在默认情况下临时文件不会被删除,然后在完成时设置一个条件,将其删除或将其移动到您想要的位置和名称。

相关问题