如何从 STDIN 行中收集所有行,直到出现空白行或 EOF,以先到者为准。它看起来像:
my @lines;
while(<> ne EOF || <> not blank) {
chomp;
push(@lines, $_);
}
要停止读取 EOF 或空行上的输入,我更喜欢这个解决方案:
while (<>) {
last unless /\S/;
# do something with $_ here...
}
与 mob 的解决方案不同,这不会在 EOF 上发出有关“在模式匹配 (m//) 中使用未初始化值 $_ ”的警告。
如果“空白”行表示里面没有字符,只有换行符\n
(Unix)或\r\n
(Windows),那么使用
my @lines;
/^$/ && last, s/\r?\n$//, push(@lines, $_) while <>;
(见这个演示)
如果“空白”行内部应该有任意数量的空格,例如" "
,则使用
my @lines;
/^\s*$/ && last, s/\r?\n$//, push(@lines, $_) while <>;
这只会检查EOF:
while (<>) {
s/\s+\z//;
push @lines, $_;
}
所以你需要添加一个空行检查:
while (<>) {
s/\s+\z//;
last if $_ eq "";
push @lines, $_;
}
或者,
while (<>) {
s/\s+\z//;
push @lines, $_;
}
简称
while (defined( $_ = <> )) {
s/\s+\z//;
push @lines, $_;
}
所以如果你想要条件中的整个while
条件,你会使用
while (defined( $_ = <> ) && /\S/) {
s/\s+\z//;
push @lines, $_;
}
要在 EOF 或空行上中断:
while ( ($_ = <>) =~ /\S/ ) {
chomp;
push @lines, $_;
}
/\S/
测试输入是否包含任何非空格。