2011-10-06 53 views

回答

4

如果您正在使用線輸入運算符逐行讀取文件句柄,則特殊變量$.會給出當前行。

以下是一些示例代碼:它讀取一個文件行,用$pos對字符進行計數。

#!/usr/bin/env perl 

use v5.12; 
use strict; 

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

my $reference = 5347; 
my $pos  = 0; 

do { 
    $pos += length <$fh>; 
} while ($pos < $reference); 

say $.; 
+0

所以我應該做一個尋求給定的位置,然後使用'$ .'來創建行號? –

+1

@Raphink - 不,它只適用於用<<>' –

+0

閱讀嗯,我認爲'seek()'不會工作,因爲它不更新特殊變量'$ .' –

3

這輕輕測試的代碼似乎對我做的工作:

my $desired = 5347; 
my $char_count = 0; 
while (<$fh>) { 
    $count += length; 
    if ($count >= $desired) { 
     print $. . $/; 
     last; 
    } 
} 

當然它假定$fh是尚未從尚未閱讀已經打開的文件句柄。

另請注意,它計數的字符,而不是字節,這是你所說的,但可能不是你的意思。

+0

OK。就像我向@Marco建議的那樣,在我們遇到這個職位之前,是否可以進行一次尋求以防止閱讀整個文件? –

+2

@Raphink:不需要,你需要有人爲你計算線路 - 只是尋求不會那樣做。你可以讀入文件「raw」並自行計算行結尾,直到你到達你的位置,或者逐行讀取並讓perl爲你計算它們,但是某種方式或某種方式需要計算行數,對不對? –