2014-10-06 53 views
1

我在使用Perl的open()函數時遇到問題。它與名稱以空白結尾的文件有關。如果我用2個參數(文件句柄和文件名)使用open(),並且文件名以空格結尾,則open()失敗。錯誤消息說,雖然文件存在,但無法找到文件。指定打開模式時不會發生這種情況,例如,如果我明確聲明該文件已打開以供閱讀。下面是一些示例代碼:當文件名以空格結尾時,perl的open()失敗

use warnings; 
use strict; 

my $file = '/tmp/test_with_ending_space '; 

open WRITE, ">", $file or die "open with mode got error: $!"; 
print WRITE "my open() test\n"; 
close WRITE; 

# open() with mode 
open READ, "<", $file or die "open without mode got error: $!"; 
while (<READ>) { 
    print; 
} 
close READ; 

# open() without mode 
open READ1, $file or die $!; 
while (<READ1>) { 
    print; 
} 
close READ1; 

,這裏是從這樣的代碼輸出:

[email protected]:~/perl$ ./test.pl 
my open() test 
open without mode got error: No such file or directory at ./test.pl line 21. 

沒有這樣的事情「通常」的文件名,即發生時的文件名與其他一些字符結束。

任何想法,如果這是一個已知的問題?如果是的話,有沒有辦法如何解決它?

爲了以防萬一,在開始告訴我「不錯,請指定模式並告訴您open()如何打開文件」。不幸的是,這個問題出現在一些核心模塊中,例如IO :: File :: open()(這是我原來被卡住的地方)。這個函數中的最後一次調用是open($fh, $file),即它調用本地open()而沒有任何特定的模式。

回答

2

它記錄在open

傳遞的 的open()的單,雙參數形式將前後空白的文件名刪除

閱讀更多下面paragrpahs細節。

+1

啊,我的壞。我之前瀏覽過這個文檔,但不知何故,這部分從我的觀點中逃脫了。 – MariusM 2014-10-06 12:24:15

+1

@choroba:斑點。這不是在實踐中出現的問題,也不是我所知道的。這是傳播開放的三參數形式的另一個理由(假設暗示任何*其他*而不是*「單參數和雙參數形式的開放」*沒有這個問題)。 – Borodin 2014-10-06 15:34:32

+1

@Borodin:的確如此。 – choroba 2014-10-06 15:40:57

-2

@choroba提供了「爲什麼」,但你也要求一個解決方法。

那麼,這是非常kludgey,但如果你絕望,不能改變open()調用,這將工作。首先,檢測文件名是否以空格結尾(我假設你可以處理該文件)。如果是這樣,則爲該文件創建一個臨時符號鏈接(不帶尾隨空格!),然後打開符號鏈接。

WFM在我的(舊)Solaris 2.6盒子中。

+1

將'open READ1,$ file'改爲'open READ1','<',$ file'是比這更好的「解決方法」! ('open READ1,「$ file \ 0」'也可能起作用,但那是邪惡的!) – ikegami 2014-10-06 14:16:35

+0

@ikegami:這個解決方案帶有條件是OP *「不能改變'open()'調用」* – Borodin 2014-10-06 15:47:11

+0

@ jimtut:你是否檢查過'symlink'沒有相同的問題?這絕對是你在發佈無影響的答案之前應該確定的東西。我不知道任何一種方式,並且在旅行時使用Android平板電腦,所以我無法檢查。 – Borodin 2014-10-06 15:49:44