2011-08-03 90 views
0

我正在用Perl寫一個腳本,它從文件讀取並打印內容。 它正在讀取文件沒有錯誤,但它不打印內容。Perl不打印文件內容

#!/usr/bin/perl 

use warnings; 
use strict; 
use autodie; 

my $dir = "/home/user/.fluxbox/.notify/notify"; 

if (-e "$dir") 
{ 
open(NOTE, "+>>", $dir) or die("Error opening file! $!"); 

chomp(my @note = <NOTE>); 

print "File Contents:\n"; 
print "@note\n"; 

close(NOTE) or die "Can't close $dir: $!"; 
} 

輸出:

Name "main::NOTE" used only once: possible typo at /path/to/script.pl line 13. 
File Contents: 

回答

4

當您打開附加文件時,會在文件末尾留下文件偏移量,因此讀取會立即生效。你需要seek向後(可能你想要的文件的開始)在閱讀之前會給你任何東西。既然你不寫的一切,你應該可能只是打開文件爲只讀(如其他人所說的)

+0

在'open'和'chomp'之間插入'seek(NOTE,0,0);''在'open'和'chomp'之間工作。我在'chomp(我的@note = )中收到警告;''只有''NOTE'只能使用一次。 – CybeatB

+0

這也可以。 +1 – vol7ron

2

,因爲你打開它(和閱讀),其中,在C意味着該文件被截斷(和一些其他語言?)如果文件已經存在,該文件將被截斷。如果你真的想向文件添加文本,你想打開它追加(和閱讀),在Perl中是用'+>>'而不是'+>'完成。但是,您的腳本不會向該文件寫入任何內容,並且您的描述表明您只想從中讀取數據,而不是寫入數據,所以在這種情況下,您只需打開它即可只用'<'進行讀取。

此外,你永遠不應該使用open的雙參數形式;請始終使用三參數表單(在本例中爲open(NOTE, '+>>', $dir))。

編輯:我忘了打開一個文件來啓動將文件位置設置到文件末尾,並且它從這個位置開始讀取。如果您實際上想要從文件中讀取數據並選擇添加到該文件(並且您提供的內容目前爲止沒有提供後者的功能),則在打開文件後,您需要使用[seek][1]將位置設置爲該文件的開始,然後然後讀取文件會給你它的內容。

+0

不要說永遠不這樣。至少在 – tchrist

+0

的範圍內,他沒有做錯任何事,不要說'永遠不',沒有解釋原因。 –

1

你不知道它是否出現錯誤,因爲你從不檢查它們。添加

use autodie; 

或檢查您的返回值是否正確。 要知道 a readlineprint是否成功的唯一方法是檢查close

close(NOTE) || die "can't close $dir: $!"; 

您不能測試的printreadline值。你必須檢查「關閉」。

還有其他問題,但這是一個好的開始。

現在驗證該文件實際上是否有任何內容要讀取。統計它並確保你閱讀了很多字節。你怎麼知道有什麼可讀的?你的狀態只是測試存在。它不測試大小,燙髮或甚至文件類型。

0
open(NOTE, "+>>", $dir) or die("Error opening file! $!"); 

你的問題是第二個參數,「+ >>」。當它切換到<時,它可以正常工作。我相信+>>表示「寫入+附加」,而<表示「讀取」。「

+1

''+ >>''表示「讀取和追加」,而不是「寫入和追加」。 – jwodder

3

http://www.perlfect.com/articles/perlfile.shtml

mode   operand create truncate 
read   <  
write   >   ✓   ✓ 
append   >>   ✓ 

Each of the above modes can also be prefixed with the + character 
to allow for simultaneous reading and writing. 

mode   operand create truncate 
read/write  +<  
read/write  +>   ✓   ✓ 
read/append +>>   ✓ 

您使用的讀/追加,所以它會讀取到EOF並從那裏開始,你需要使用<在文件的開頭開始。

0

我用Perl語言編寫一個腳本,從文件中讀取並打印 內容。

你需要我什麼S:

  • 獲取文件名
  • 打開文件句柄
  • 閱讀和打印數據

而不是讀整個文件到內存中,最好是通過線使用在線模式while。使用chomp將刪除換行符,並顯着增加輸出,因此除非需要,否則不要使用該換行符。

你不需要檢查文件是否存在,因爲openautodie會爲你照顧。該腳本還可以與命令行參數一起使用,例如script.pl filename.txt。如果不需要,請刪除shift ||

代碼:

use strict; 
use warnings; 
use autodie; 

my $file = shift || "/home/user/.fluxbox/.notify/notify"; 

open my $fh, '<', $file; 

print "File contents:\n--------------\n"; 
print while (<$fh>);