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
.如果给出了命令行参数,那么ARGV
将open
依次编辑每个参数.这类似于
# 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 * |
可能无法执行您想要的操作.