2011-04-30 61 views
1

在開始的時候我只是用下面的計算每條線的長度:試圖指望在Perl在一條線上charcters和失敗

while(<FH>){ 
    chomp; 
    $length=length($_); 
} 

但是當我比較結果我生產的一個了通過Linux命令WC,我發現了一個問題: 在我的文件中的所有選項卡字符被視爲在Perl 1 character長的,而它是8wc,所以我做了以下修改:

​​

對於上面的代碼,它現在適用於所有大多數情況,除了一個以外,在wc中並非所有選項卡都被計數,但只有那些沒有被某些字符佔用的選項,例如,如果在一行的開始,我輸入1234,然後按一個選項卡,在wc它不算作一個選項卡,但上面的代碼計算,有沒有什麼辦法可以採取解決這個問題?由於

解決它,使用tab expansion,這裏是代碼:

1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e; 
$length=length($string); 

,如果任何人都可以給它一個解釋,那將是真棒,我測試了它可以工作,但是不太瞭解它。無論如何,感謝所有的幫助

回答

1

解決它,使用tab expansion,這裏是代碼:

1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e; 
$length=length($string); 

,如果任何人都可以給它一個解釋,那會真棒,我測試了它的工作,但不太明白它。無論如何,感謝所有的幫助

0

如何從Perl內調用wc?

$result = `wc -l /path/to/file` 
+0

所以,我絕對沒有辦法,我可以在Perl中解決這個問題? – user685275 2011-04-30 21:30:05

+0

我確定有,你可以在Perl中做任何事:)如果你不能從Perl調用wc,那麼希望有人會爲你發佈另一個解決方案 – 2011-04-30 21:32:54

+0

'wc -l'會計算行數,'wc - m'會計算字符的數量。 – shawnhcorey 2011-05-01 13:13:11

8

我不認爲標籤是你的問題,WC不算一個標籤爲八個字符。我認爲你的問題是你正在剝離EOL,但是wc指望它們。另外,你沒有積累長度,你只是跟蹤最後一行的長度。這:

while(<FH>){ 
    chomp; 
    $length=length($_); 
} 

應該更像這樣:

my $length = 0; 
while(<FH>) { 
    $length += length($_); 
} 
# $length now has the total number of characters