2012-03-08 66 views
0

是否有一个内置Perl变量,用于跟踪在while循环中有多少记录被读取?在Perl中计数记录

例如,假设我这样做:

my $count; 
while (<>) { 
$count++; 
} 
print $count; 

有没有办法做到这一点没有定义$count?也就是说,是否已经有一些包含这些信息的变量?

+0

有什么不对目前的做法?它是多用途的。为了统计文件中的行数,有很多实用程序。 – aartist 2012-03-08 16:34:21

+0

为什么你不想定义'$ count'? – 2012-03-08 20:07:39

+0

@briandfoy - 除编写简洁的代码外,没有编程原因。我认为必须有'$ .'这样的东西,但不知道它叫什么。 – itzy 2012-03-08 22:31:52

回答

5

$.会告诉您当前正在读取的文件的当前行号。

请注意,该变量在对文件句柄的close()调用时会重置,因此如果旧文件句柄在您从新文件句柄开始读取时未关闭,则该变量即使在文件间也会保持增量。但是,如果文件句柄关闭你必须将其重置为0。例如,在您的示例代码,该代码将不断跨越的文件数读取:

foreach my $arg (@ARGV) { 
    open(I, $arg); 
    while(<I>) { 
     print $.,"\n"; 
    } 
} 

但是,如果你关闭文件句柄在任何下一个开放呼叫前点:

foreach my $arg (@ARGV) { 
    open(I, $arg); 
    while(<I>) { 
     print $.,"\n"; 
    } 
    close(I); # NEW LINE 
} 

然后它会重置$.再次零,你会得到每个文件的唯一计数。

+2

当使用'<>'时,$ .'会跨文件计数,它不会重置,请参阅[perldoc perlvar](http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles#%24 )。 – Hasturkun 2012-03-08 14:53:49

+0

哎呀,你是对的。虽然当我第二次阅读它时,却不太清楚这一点。 – 2012-03-08 14:59:05

+0

大大扩展文本以反映开放/关闭问题。 – 2012-03-08 15:04:01

0

Perl中没有自动循环计数器。有计数器来计算文件句柄中的当前行号(请参阅Wes Hardaker)。

loopcounter会非常复杂(如何处理循环内的循环?)。

所以,回到老$计数++ :)

0

您可以使用一个简单的命令行脚本,也:

perl -ne 'if (eof) {printf "%6d %s\n",$.,$ARGV;close @ARGV}' file1 file2 file3 
    10 file1 
13921 file2 
    12 file3