Swift以外の話題もそろそろ扱いたくなってきたので、手頃な問題を。
イントロ7ページ目
最初から入っていないコマンドは各ディストリビューションの流儀でインストール
え?それイージーモードすぎない?
というわけで自らにUbuntu 14.04 LTS/OS X 10.9.4に初期状態で入っていないコマンドは一切使わないという条件で解いてみました。
###1. 次のように、画面にバッテンを描いてください。
$ perl -E 'push@a," "x$_."x"." "x(19-2*$_)."x"." "x$_' \
-E 'for (0..9); say for @a," "x(10)."x",reverse@a'
banner(1)
を使えば楽勝、と思いきや…
$ banner
The program 'banner' is currently not installed. You can install it by typing:
sudo apt-get install sysvbanner
というわけで正攻法で。
###2. 次のファイルの各行について回文を完成させてください。
$ perl -Mopen=:utf8 -CIO -plE '$_=substr($_,0,-1).reverse' kaibun
###3. ウェブ等からデータを取得して南武線の駅名のリストを作ってください。
$ wget -q 'http://express.heartrails.com/api/json?method=getStations&line=JR南武線' -O - \
| json_pp | perl -nlE 'say $1 if /"name" : "(.*?)"/'
OS X では wget -q url -O -
の代わりにcurl url
で。
Perl 5.14以降がプリインストールされた環境であれば、json_pp
は必ず入っています。UbuntuもOS Xもこれは難なくクリアー
###4. 北から順(正確には都道府県番号順)に並べてください。
$ wget -q 'http://elze.tanosii.net/d/kenmei.htm' -O - \
| piconv -f sjis -t utf8 \
| perl -Mopen=utf8 -CIO -nlE 'say$1 if/ <TD>(.*)\(/'
```
`piconv`もPerl 5.8以降がインストールされた環境であれば入っているはずです。
###5. 各行の数字を大きい順にソートしてください。
````sh
perl -anlE '$,="\t";say shift@F,sort{$b<=>$a}@F' input
###6. 次のファイルについてグラフを作ってください。
$ perl -plE '$_="$_\t"."*"x$_' num
5.と6.はちょっと簡単杉かなあ。
###7. Q6のグラフを次のように縦にしてください。
perl -nE 'push@n,$_;$_="*"x$_;$m=length if $m<length;push@l,[split//];' \
-E 'END{for(1..$m){for$i(0..@l+1){$l.=" ".($l[$i][$m-$_]||" ")}' \
-E '$l=~s/ +$//;say$l;$l=""}printf"%3d",shift@n while@n;print"\n"}' numonl
これが一番泥臭い。まだ改善の余地がありそう。
###8. 次のデータは、何かの試合の結果ですが、各チームが何勝何敗だったかを集計してください
$ perl -nlE '@a=split/[ -]/;$l=$a[2]<$a[3];' \
-E '$l{$l?$a[0]:$a[1]}++;$w{$l?$a[1]:$a[0]}++;' \
-E 'END{say"$_ $l{$_}負"for keys%l;say"$_ $w{$_}勝"for keys%w}' result | sort
まとめ
「シェル芸」といった場合、Perlの利用が反則か否かはビミョーな感じもするのですが、少なくとも
- OSにプリインストールされているコマンドのみを利用
- CPANなど外部モジュールも禁止
というUSPよりも厳しいルールを適用してもなお、LinuxのほとんどのディストリビューションとOS Xでは反則になりません。FreeBSDだと5以降はPorts化されたので反則になっちゃいますが:-p
OS間の微妙な違いを吸収するという点においても有利です。
というわけでawkでがまんしないで、Perl使いましょうPerl!
Dan the Perl Monger