2011-10-16 22 views
0

我想用Perl來計算消息中字符出現的頻率。例如,如果字符「a」在消息中出現10次,則頻率將爲10.爲此,我使用getc函數一次從FILE一個字符讀取消息。這是我寫的片段。我知道這是非常基本的。但是,當我編譯,我得到一個錯誤:爲什麼我的程序使用Perl的getc函數無法正常工作?

詳情:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $input=$ARGV[0]; 

open(INPUT,"<$input"); 

while(<INPUT> 
{ 
my $c=getc(INPUT); 
print $c."\n"; 
} 

close(INPUT); 

我得到下面的錯誤,當我嘗試編譯:

Use of uninitialized value in print at AccessChar.pl line 13, <INPUT> line 1.

我不能圖out,這個腳本有什麼問題。有人可以幫我解決這個問題嗎?

我甚至嘗試過使用getc INPUT而不是getc(INPUT)。我認爲運行此腳本時不需要包含任何其他軟件包。

+4

您在該代碼段(在'while行中)出現語法錯誤。 – Mat

+1

'getc'不工作...噢,是的。 –

回答

2

混合讀取文件操作(<...>)與getc是一個壞主意。這不符合你的想法。

嘗試在程序中放入一些調試輸出以查看發生了什麼。我通過自行運行來測試程序(./getc getc)。

while循環開始時,<INPUT>從文件中讀取一行並將其存儲在$_中。然後,您使用getc來讀取文件中的下一個字符。這將是文件第二行中的第一個字符(可能是換行符 - 這可能是該行中唯一的字符)。

下一次循環時,<INPUT>將讀取下一行輸入。這是use strict系列。 getcuse warnings中讀取'u'的下一個字符。

所以它繼續到文件的末尾。 <INPUT>讀取一行,然後getc讀取下一行中的第一個字符。

這不是你想要的。如果你想一次閱讀一個角色,那麼你只需要getc

#!/usr/bin/perl 

use strict; 
use warnings; 

my $input = shift; 

open(my $file, '<', $input); 

while (defined(my $c = getc $file)) { 
    print "$c\n"; 
} 

另一種方法是隻使用<...>和你讀它分割每行。

#!/usr/bin/perl 

use strict; 
use warnings; 

my $input = shift; 

open(my $file, '<', $input); 

while (<$file>) { 
    foreach my $c (split //) { 
    print "$c\n"; 
    } 
} 

但混合兩個接近是永遠不會工作。

5
while (<INPUT>) 

將在循環的每次迭代中從INPUT讀取整行。如果你想一次處理該文件句柄一個字符,它不是正確的構造。

試着這麼做:

my $c; 
while (defined($c = getc(INPUT))) { 
    print $c, "\n"; 
} 
+0

謝謝!它的作品:)我喜歡你的想法。由於getc在Error或EOF上返回undef值,我們可以使用定義的函數。有趣! –

1

只是一小TIMTOWTDI:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Data::Dumper; 

local $/; 
my %chars; 

$chars{$_}++ for split //, <>; 

print Dumper \%chars; 

其中只要該文件不是太大,啜工程;如果是讀取和分割每一行。使用方法:

$ count_chars.pl file_to_read 
相關問題