如何收集STDIN行中的所有行,直到空行或EOF(以先到者为准)。它看起来像是:
my @lines;
while(<> ne EOF || <> not blank) {
chomp;
push(@lines, $_);
}
答案 0 :(得分:7)
要停止阅读EOF或空白行的输入,我更倾向于这个解决方案:
while (<>) {
last unless /\S/;
# do something with $_ here...
}
与mob的解决方案不同,这不会发出警告&#34; 在模式匹配中使用未初始化的值$ _(m //)&#34;在EOF上。
答案 1 :(得分:1)
如果“空白”行表示内部没有字符,只需新行\n
(Unix)或\r\n
(Windows),则使用
my @lines;
/^$/ && last, s/\r?\n$//, push(@lines, $_) while <>;
(见this demo)
如果“空白”行内部应包含任意数量的空格,例如" "
,请使用
my @lines;
/^\s*$/ && last, s/\r?\n$//, push(@lines, $_) while <>;
答案 2 :(得分:1)
这只会检查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, $_;
}
答案 3 :(得分:0)
打破EOF或空行:
while ( ($_ = <>) =~ /\S/ ) {
chomp;
push @lines, $_;
}
/\S/
测试输入是否包含任何非空格。