Perl - 收集所有STDIN直到空行或EOF

时间:2012-11-05 21:07:46

标签: regex arrays perl stdin

如何收集STDIN行中的所有行,直到空行或EOF(以先到者为准)。它看起来像是:

 my @lines;

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

4 个答案:

答案 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/测试输入是否包含任何非空格。