2010-04-16 100 views
4

我收到一個錯誤,我不明白。我正在使用File:Find來在Windows上使用Activestate Perl 5.8.8遞歸一個fylesystem並嘗試登記$File::Find::name;所以我不是stat - 從文本文件掃描得到的文件名需要chomp -ing或刪除換行符。我無法獲取文件的修改時間,在mtime在:爲什麼Perl會抱怨「包含換行符的文件名不成功」?

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($File::Find::name); 

所以嘗試了

-s $File::Find::name 

給我的錯誤:

Unsuccessful stat on filename containing newline

發現一個典型的文件名是F01 -01-10 Num 0-00000.pdf但我得到相同的錯誤,甚至在重命名E02.pdf

+2

爲什麼你不嘗試chomp它,看看。如果它的工作,這意味着你的文件真的有一個換行符。 – ghostdog74 2010-04-16 10:55:34

回答

11

根據perldiag if 任意文件操作失敗且文件名恰好包含換行符,則會發出警告「包含換行符的文件名不成功」。

假設是,正如你所說,文件名來自標準輸入或類似,並且用戶已經忘記了chomp新行。無論如何,您可能需要通過chomp來傳遞字符串,以查看它是否有效。

some evidence&CORE::stat的mtime可能與OS PATCHLEVEL和ActiveState的Perl的版本的一些組合被打破 - 一個建議的解決方法是使用File::stat模塊,像這樣:

my $sb = stat($File::Find::name); 
my $mtime = scalar localtime $sb->mtime; 

...你可能會發現文件:: stat的對象表示比CORE::stat返回的列表更方便。

0

即使我在嘗試刪除文件夾時也遇到了同樣的錯誤。我在使用rmtree命令之前使用chomp。這解決了我的問題。

0

在我的腳本中遇到同樣的問題,發現我的錯誤是當我創建文件時,我將一個日期標記標記爲結尾,並在將它添加到文件名之前忘記chomp我的$ DATE變量。

0

是的,剛剛用一個手工構建的標量碰到了這個問題。抓住了我的頭,直到我意識到我已經在文件名中包含時間/日期戳。 Chomp日期命令和瞧,問題解決了。

+2

你確實意識到〜完全相同的東西已經在2年多前發佈了,對吧? – 2012-10-11 22:13:32

相關問題