Perl/Ruby/Python各言語をかじったところで、ワンライナーを使えるようになっていきたいと思います。
PerlやRubyでは-eオプション。Pythonでは-cオプションを使って直接スクリプトを書くことができます。
takk@deb9:~$ perl -e 'print("HELLO\n")' HELLO takk@deb9:~$ ruby -e 'print("HELLO\n")' HELLO takk@deb9:~$ python -c 'print("HELLO")' HELLO takk@deb9:~$
この時点で、Pythonのprintは改行が付いてて便利だなあ、と思ってしまいますが、Perl/Rubyそれぞれ別の表示方法を備えています。しかも()は省略できます。
Ruby
takk@deb9:~$ ruby -e 'puts"HELLO"' HELLO takk@deb9:~$
Perl
takk@deb9:~$ perl -E 'say"HELLO"' HELLO takk@deb9:~$
さて、繰り返しのワンライナーを書いていきましょう。0から9までの数字を表示するコマンドです。まずはPerlから。
takk@deb9:~$ perl -e 'foreach$i(0..9){print"i=$i\n"}' i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 takk@deb9:~$
Perlのスカラー変数が$をつける決まりを利用してforeachの後に空白が不要になるのがうれしいです。printの文字列のクォート””内にスカラー変数を登場させることができるのもいいですね。
次はRubyです。eachが普段から使えるとかっこいいのでしょうけど、私はあまり使いこなしてません。Rubyの|i|という書き方は見栄えがいいです。||はまっすぐの線なので、よくプログラム中コメントのの罫線アートするときに使いますし。
takk@deb9:~$ ruby -e '(0..9).each{|i|printf"i=%d\n",i}' i=0 i=1 (省略) i=8 i=9 takk@deb9:~$
timesでもカウント値が0から始まるので同じように表示させることができます。0から始まるか1から始まるか、いつも忘れてしまうので、これも使いこなしてはいませんが。
takk@deb9:~$ ruby -e '10.times{|i|printf"%i\n",i}' 0 1 (省略) 8 9 takk@deb9:~$
Pythonです。分かりやすいし、すっきりしてる気がします。ただ、rangeの数字の指定方法は独特ですよね。
takk@deb9:~$ python3 --version Python 3.5.3 takk@deb9:~$ python3 -c 'for i in range(0,10):print("i=%i" % i)' i=0 i=1 (省略) i=8 i=9 takk@deb9:~$
2.7.xだと、printの()が省略できます。()はつけて覚えておいた方がよいですが。
takk@deb9:~$ python --version Python 2.7.13 takk@deb9:~$ python -c 'for i in range(0,10):print "i=%i" % i' i=0 i=1 (省略) i=8 i=9 takk@deb9:~$
さて、Perlに戻ります。倒置して書くことができて、これは、最初見たときは何事かと思ったのですが、慣れると、ifの倒置と同じで、英語的かなあと思って、すっきりしてる気がしてきました。
takk@deb9:~$ perl -e 'print "i=$_\n" foreach 0..9' i=0 i=1 (省略) i=8 i=9 takk@deb9:~$
減らせばいいってものでもないですが、キーボードをあまり打ちたくない場合は、もっとスクリプトを短くできます。このようなPerlのどこまでも省略できそうな可能性って好きです。
takk@deb9:~$ perl -E 'say"i=$_"for 0..9' i=0 i=1 (省略) i=8 i=9 takk@deb9:~$
コメント