LoginSignup
26
23

More than 5 years have passed since last update.

第12回本当は怖くないPerl芸勉強会?

Posted at

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. 各行の数字を大きい順にソートしてください。

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

26
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23