是否有一个内置Perl变量,用于跟踪在while循环中有多少记录被读取?在Perl中计数记录
例如,假设我这样做:
my $count;
while (<>) {
$count++;
}
print $count;
有没有办法做到这一点没有定义$count
?也就是说,是否已经有一些包含这些信息的变量?
是否有一个内置Perl变量,用于跟踪在while循环中有多少记录被读取?在Perl中计数记录
例如,假设我这样做:
my $count;
while (<>) {
$count++;
}
print $count;
有没有办法做到这一点没有定义$count
?也就是说,是否已经有一些包含这些信息的变量?
$.
会告诉您当前正在读取的文件的当前行号。
请注意,该变量在对文件句柄的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
}
然后它会重置$.
再次零,你会得到每个文件的唯一计数。
当使用'<>'时,$ .'会跨文件计数,它不会重置,请参阅[perldoc perlvar](http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles#%24 )。 – Hasturkun 2012-03-08 14:53:49
哎呀,你是对的。虽然当我第二次阅读它时,却不太清楚这一点。 – 2012-03-08 14:59:05
大大扩展文本以反映开放/关闭问题。 – 2012-03-08 15:04:01
Perl中没有自动循环计数器。有计数器来计算文件句柄中的当前行号(请参阅Wes Hardaker)。
loopcounter会非常复杂(如何处理循环内的循环?)。
所以,回到老$计数++ :)
您可以使用一个简单的命令行脚本,也:
perl -ne 'if (eof) {printf "%6d %s\n",$.,$ARGV;close @ARGV}' file1 file2 file3
10 file1
13921 file2
12 file3
有什么不对目前的做法?它是多用途的。为了统计文件中的行数,有很多实用程序。 – aartist 2012-03-08 16:34:21
为什么你不想定义'$ count'? – 2012-03-08 20:07:39
@briandfoy - 除编写简洁的代码外,没有编程原因。我认为必须有'$ .'这样的东西,但不知道它叫什么。 – itzy 2012-03-08 22:31:52