问题背景:
while循环是Perl的基本控制结构之一,自早期以来用于处理数据、读取文件和迭代集合。它与特殊变量$_紧密集成,默认在从文件或其他迭代中读取行时接受值。
问题:
不正确地使用变量$_、在没有显式描述符的情况下读取文件以及错误地结束循环会导致处理字符串时出现错误和数据丢失。默认情况下使用$_的自动处理提高了灵活性,但在编写代码时需要小心,尤其是在循环内部对字符串的嵌套和修改时。
解决方案:
读取文件时,通常使用表达式
while (<FILEHANDLE>) { # ... }
甚至可以使用while (<>)从标准输入或传递给脚本的文件列表中读取。在这样的循环内部,Perl会自动将读取的字符串放入$_中,这使得使用正则表达式、替换和其他操作变得简洁。如果需要明确地指定变量,可以使用构造while (my $line = <FILEHANDLE>)。
代码示例:
open my $fh, '<', 'file.txt' or die $!; while (<$fh>) { chomp; # 工作于$_ print "行: $_ "; } close $fh;
关键特性:
如果在while循环中修改$_会发生什么?
在循环内修改$_不会影响文件本身,只会影响当前迭代中的变量值。但是同时处理多个数据源时,重复使用$_可能会导致混淆。
如果在没有预先打开文件的情况下使用while (<>)会发生什么?
没有显式打开文件的操作符<>会从STDIN或在脚本启动时在@ARGV中指定的文件中读取。如果没有指定任何内容,则会等待键盘输入。
在while内是否必须使用chomp来删除 ?
不,并非必须,但是如果没有chomp,每行将包含换行符
。这通常会导致意外结果(例如,打印时出现双换行符)。
** 消极案例
在解析日志的脚本中,忘记在while (<FILE>)中添加chomp,导致控制台输出中出现多余的换行符。
优点:
缺点:
** 积极案例
开发者始终通过my $line = <$fh>明确声明变量,并在读取行后立即使用chomp。
优点:
缺点: