Perl - while(<>)文件处理

Man*_*kus 18 perl cycle filehandle while-loop

一个简单的程序,带有while( <> )句柄文件作为arguments(./program 1.file 2.file 3.file)和Unix系统的标准输入.

我认为它将它们连接在一起,并且工作是一行一行的.问题是,我怎么知道我正在使用第一个文件?然后是第二个.

举个简单的例子,我想在一行中打印文件的内容.

while( <> ){
    print "\n" if (it's the second file already);
    print $_;
}
Run Code Online (Sandbox Code Playgroud)

TLP*_*TLP 21

菱形运算符不会连接文件,它只是打开并连续读取它们.你如何控制这取决于你如何控制它.检查文件最后一行的简单方法是使用eof:

while (<>) {
    chomp;             # remove newline
    print;             # print the line
    print "\n" if eof; # at end of file, print a newline
}
Run Code Online (Sandbox Code Playgroud)

您还可以考虑使用计数器来跟踪您正在处理的文件

$counter++ if eof;
Run Code Online (Sandbox Code Playgroud)

请注意,此计数将在文件的最后一行增加1 ,因此请勿过早使用它.

如果要跟踪$.当前文件句柄中的行号,可以close使用ARGV文件句柄重置此计数器:

while (<>) {
    print "line $. : ", $_;
    close ARGV if eof;
}
Run Code Online (Sandbox Code Playgroud)


amo*_*mon 12

<>是readline运算符的一个特例.它通常需要一个文件句柄:<$fh>.

如果省略了ARGV文件句柄,则使用魔术文件句柄.

如果没有给出命令行参数,ARGV则为STDIN.如果给出了命令行参数,那么ARGVopen依次编辑每个参数.这类似于

# Pseudocode
while ($ARGV = shift @ARGV) {
  open ARGV, $ARGV or do{
    warn "Can't open $ARGV: $!";
    next;
  };
  while (<ARGV>) {
    ...; # your code
  }
}
Run Code Online (Sandbox Code Playgroud)

$ARGV变量是真实的,并拥有目前打开的文件的文件名.

请注意,两个arg形式open(可能在幕后使用)是非常不安全的.文件名rm -rf * |可能无法执行您想要的操作.