perl – 当前文件行号,带$.变量
发布时间:2020-12-15 21:42:51 所属栏目:大数据 来源:网络整理
导读:我知道我可以使用内置变量$来获取我正在循环的文件的当前行号.作为一个实验,我使用它来为文件中的每一行添加值$. (当前行号).但是,这没有按预期工作.即给出以下文件内容 line oneline twoline three 那么我希望以下代码为每一行添加其行号前缀 for my $line
我知道我可以使用内置变量$来获取我正在循环的文件的当前行号.作为一个实验,我使用它来为文件中的每一行添加值$. (当前行号).但是,这没有按预期工作.即给出以下文件内容
line one line two line three 那么我希望以下代码为每一行添加其行号前缀 for my $line (<FILE>) { print "$. : $line"; } 但是,它给出了以下输出 3 line one 3 line two 3 line three 在每行前面加上文件中的行数.而不是当前的行. 解决方法
那是因为你编写循环的方式是在循环遍历行之前读取整个文件.除非你有特殊的理由需要比简单顺序访问文件更好的东西,你应该使用while而不是for,如下所示:
while (my $line = <FILE>) { print "$. : $line"; } 当< filehandle>在列表上下文中调用(因为它在for循环中),它将文件的全部内容作为行列表返回.因此,您的代码的行为方式与您编写代码的方式大致相同: my @lines = <FILE>; # now $. is set to the end of the file for my $line (@lines) { ... } # you're just looping over an array,not touching $. 要获得所需的结果,您应该调用<>在标量上下文(while条件中的赋值)中重复执行,从文件中一次获取一行并使用$执行循环体.设置为正确的数字. 此外,全局文件句柄被认为是不好的做法.有几个原因,最好使用词法变量引用的文件句柄,如下所示: open my $file,'<',$filename or die $!; while (my $line = <$file>) { print "$. : $line"; } 另外,因为$.是一个包含最近执行的读取操作的行号的全局变量,如果在< $file>之间有任何其他读取的可能性,则不应该依赖它.和印刷品.相反,请询问您用于其行号的文件句柄: open my $file,$filename or die $!; while (my $line = <$file>) { print $file->input_line_number," : $line"; } 使用全局文件句柄,即使有点笨拙,它甚至可以工作: while (my $line = <FILE>) { print ${*FILE}->input_line_number," : $line"; } …甚至是由空<>读取的默认值,其名称为ARGV: while (my $line = <>) { print ${*ARGV}->input_line_number," : $line"; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |