2013-07-15 62 views
0

我正在嘗試爲perl文件上傳腳本編寫一些單元測試。我對perl仍然很陌生,所以我有一些問題可以實現我期望從我的代碼中獲得的結果。在perl和STDERR內容中打開文件問題

基本上我的思維過程是,我可以請求將告訴腳本只獲取的文件已經在系統上,而不是嘗試使用上傳的文件一起傳遞test_only屬性。

我創建了一個測試文件,並把它放在我的輸出/ tmp目錄。我確保將它的權限設置爲775.它只是一個簡單的.txt文件,它說「我是測試文件」。

我期望當前發生的是,當我運行我的測試腳本時,我應該看到文件的內容打印到錯誤日誌以及一些對緩衝區的引用(所以我可以驗證文件正在打開正確)。但是,這不會發生,錯誤日誌中沒有任何內容。我想知道文件是否正確打開?

我敢肯定,我只是失去了一些東西有關如何perl的打開文件的基礎。任何幫助將不勝感激。謝謝:)

這是我的代碼的相應片段:

my $test_only = 1; 
my $tmp_uploads_path = "/home/my_instance/output/tmp/"; 
if($test_only) 
{ 
    #put simulated file handle and file name here 
    $file = ""; 
    $file_name = "test_file.txt"; 
} 
else 
{ 

    $file = $q->upload('file') 
     || die "No file data sent\n $!"; 

    $file_name = $q->param('file_name') 
     || die "No file_name sent\n $!"; 
} 

######## 
#SAVE THE UPLOAD 
######## 
my $bufsize = 1024;  
my $buffer = ''; 

open(my $TMPFILE, ">".$tmp_uploads_path.$file_name); 
binmode $TMPFILE; 
print STDERR "=> ".Dumper($TMPFILE)."\n"; 
while(read ($TMPFILE, $buffer, $bufsize)){ 
    print STDERR "=> ".Dumper($TMPFILE)."\n"; 
    print STDERR "=> ".Dumper($buffer)."\n"; 
    print $TMPFILE $buffer;  
} 
close($TMPFILE); 

回答

3

你的來信,打開了$TMPFILE,由於>模式。因此,你無法讀取它。

你應該始終把use strict; use warnings;在腳本的頂部,這一切都提醒你這個問題!

您應該打開文件如

my $name = ...; 
open my $fh, "<", $name or die "Can't open $name: $!"; 

use autodie; 
open my $fh, "<", $name; 

也就是說,做適當的錯誤處理,並使用open三ARG變種:手柄,模式和名稱(唐」 t concat模式和名稱,除了古代perls)。

我也驚訝您正在使用read。您可以通過

local $/ = \$bufsize; 
while (defined(my $buffer = <$TMPFILE>)) { ... } 
+0

感謝您的幫助。這個答案讓我在那裏。我實際上正在爲這個代碼編寫一個新API的測試,所以我並不感到驚訝的是有一些舊標準被使用。 – Rooster