2013-07-30 90 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);,然後自己斷開文件鏈接或移動到適當的位置。

在關閉文件句柄後移動文件會更安全(以防發生緩衝)。所以我寧願採用一種方法,在默認情況下臨時文件不會被刪除,然後在完成時設置一個條件,將其刪除或將其移動到您想要的位置和名稱。

相關問題