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 に答える