15章(文字列処理とソート) 練習問題1

数値のリストを読み込んで、それを数値としてソートした上で、右寄せで表示するプログラムを書いてください。

あいさー。

自作コードは以下になります。

#!/usr/bin/perl
use strict;
use warnings;

my @numbers = qw(17 1000 04 1.50 3.14159 -10 1.5 4 2001 90210 666);

@numbers = sort { $a <=> $b } @numbers;
for (@numbers) {
    printf "%10g\n", $_;
}

出力結果は以下になります。

       -10
       1.5
       1.5
   3.14159
         4
         4
        17
       666
      1000
      2001
     90210

解答はどうだろう。
へー。なかなかトリッキーな部分がありますね。
それを参考にコードを書き換えるとこうなります。

#!/usr/bin/perl
use strict;
use warnings;

my @numbers = qw(17 1000 04 1.50 3.14159 -10 1.5 4 2001 90210 666);
for ( sort {$a <=> $b} @numbers ) {
        printf "%10g\n", $_;
}

最初のコード作成時に面倒だと思った部分がスマートになりました。
あと注意したいのはprintf命令に渡すフォーマット文字列。
上記のコードでは"%g"フォーマットを使用していますが、

04
1.50

というデータが

4
1.5

と出力されています。
この問題を解決するにはフォーマット文字列として"%s"を与える。
これによってfor命令で処理する要素が文字列とみなされ、元のデータのまま出力されるんですね。
型の指定が無いPerlならではのテクニックですね。