ROUTE 3390

備忘録的な用途で書いていますが、どなたかの役に立つ事があれば嬉しいです。

宇宙ステーション演算子について解説してみた

Perlの食えない事情-演算子編を読んで、とても面白く演算子を学ぶ事が出来ました。

なかでも「宇宙ステーション演算子:-+-」はなかなか理解出来なかったので、僕なりに解説したいと思います。


その前に「ビーナス演算子:0+,+0」について触れておきます。

print '100MB' +0;     # 100
print 0+ '5GB';       # 5
print 0+ 'TB';        # 0
print 'route3390' +0; # 0

上記ブログでも簡単な説明がありますが、Perlは文字列と数値などの型を区別して持つ事は出来ません。
StringとかIntとかがないんです。

計算しようとすれば数値として扱うし、文字列操作しようとすれば文字列として扱います。
そのため、'100MB'というような値は
数値として扱えば、「100」として、
文字列として扱えば「100MB」として評価されます。

ビーナス演算子という大した名前がありますが、ただ 0を足しているだけですね。
0を足すのは先でも後でも構いません。
♀という記号を横にしたように見えることから名付けられたのでしょうw

文字列の先頭が「数値」または「-」「+」の符号でない場合は0として評価されます。


さて、宇宙ステーション演算子の解説に入ります。
上記ブログでは優先順位の高いビーナス演算子という説明がありますが、
それは使い方についての話で、演算子は別の動作をしています。

print 0+  '100MB' x 3; # 100
print -+- '100MB' x 3; # 100100100

※「x」はカケルではなく繰り返し演算子です。

まず、ビーナス演算子のほうは優先順位が+より、xのほうが高いので下記のような評価になっています。

print 0+ '100MB' x 3;
print 0 + '100MB' x 3;
print 0 + '100MB100MB100MB';
print 100;

次に宇宙ステーション演算子です。
ビーナス演算子二項演算子の「+」が使われているのに対し、
こちらは単項演算子の「+」と「-」が使われています。
perldocに説明があります。

print -+- '100MB' x 3;
print -+ '-100' x 3;
print - '-100' x 3;
print '100' x 3;
print '100100100';

単項演算子の「-」は文字列を数値として評価した後、+/-の符号を反転します。
単項演算子の「+」は何もしません。

これ例えば下記のようにするとエラーになります。

print -- '100MB';

「--」とするとデクリメント演算子になってしまうため、引数に直接値を渡すんじゃねーってエラーになってしまうんです。
それを防ぐために「-+-」としてるんですね。