1

如何从 STDIN 行中收集所有行,直到出现空白行或 EOF,以先到者为准。它看起来像:

 my @lines;

 while(<> ne EOF || <> not blank) {
      chomp;
      push(@lines, $_);
 }
4

4 回答 4

7

要停止读取 EOF 或空行上的输入,我更喜欢这个解决方案:

while (<>) {
    last unless /\S/;
    # do something with $_ here...
}

与 mob 的解决方案不同,这不会在 EOF 上发出有关“在模式匹配 (m//) 中使用未初始化值 $_ ”的警告。

于 2012-11-05T21:28:08.610 回答
1

如果“空白”行表示里面没有字符,只有换行符\n(Unix)或\r\n(Windows),那么使用

my @lines;
/^$/ && last, s/\r?\n$//, push(@lines, $_) while <>;

(见这个演示


如果“空白”行内部应该有任意数量的空格,例如"         ",则使用

my @lines;
/^\s*$/ && last, s/\r?\n$//, push(@lines, $_) while <>;
于 2012-11-05T21:10:15.410 回答
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, $_;
}
于 2012-11-05T21:30:39.420 回答
0

要在 EOF 或空行上中断:

while ( ($_ = <>) =~ /\S/ ) {
   chomp;
   push @lines, $_;
}

/\S/测试输入是否包含任何非空格。

于 2012-11-05T21:20:15.303 回答