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ならではのテクニックですね。