繰り返しのワンライナー(Perl/Ruby/Python)

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:~$

コメント

タイトルとURLをコピーしました