-1

このようなものをワンライナーとしてどのように書くべきですか?

-loop whileand内のすべてを取りたくなるでしょうが、ステートメントを使用perl -e '...' dataするより良い方法はありifますか?

open(F, '<', 'data') or die $!;

while (my $line = <F>) {

    if ($line =~ m/test /) {
        my @a = split / /, $line;
        printf("%2s %4s %4s\n", substr($a[1], 1), $a[2], substr($a[5], 0, -1));
    } else {
        print $line;
    }

}

close F;
4

2 に答える 2

6

まず、実際のプログラムをクリーンアップしましょう。

while (<>) {
   if (/test/) {
      my @a = split;
      $_ = sprintf("%2s %4s %4s\n", substr($a[1], 1), $a[2], substr($a[5], 0, -1));
   }

   print;
}

-pそうすれば、 and -a(「ワンライナーを作る」)を利用しやすくなります。

perl -pale'$_ = sprintf("%2s %4s %4s", substr($F[1], 1), $F[2], substr($F[5], 0, -1)) if /test/' data
于 2012-12-31T00:59:30.073 に答える
1

次のような醜いもの:

perl -anle 'printf("%2s %4s %4s", substr($F[1], 1), $F[2], substr($F[5], 0, -1)),next if grep /test/, @F;print'

多分?しかし、なぜワンライナーを使いたいのでしょうか?

于 2012-12-31T00:42:27.167 に答える