perl になくて C にだけある演算子は以下の通り。
perl は C と同じく、演算子に対する引数が全て静的であり、 副作用もないと判断した時は expression の評価をコンパイル時に行う (特に、コンパイル時に変数置換を行わない文字列間の結合を発見した場合)。 バックスラッシュの解釈もコンパイル時に行われる。
'Now is the time for all' . "\n" . 'good men to come to.'
これは一つの文字列になってしまう。
++
演算子にはちょっとした細工をしている。
数字や、数値のコンテキストで使った変数をインクリメントすると、
通常のインクリメントを行う。
しかし、セットしてから文字列のコンテキストでしか使っておらず、
ヌルでない値を持っていて、
パターン /^[a-zA-Z]*[0-9]*$/
にマッチするような変数の場合、
文字列としてのインクリメントを文字列の範囲はそのまま、
キャリー付きで行う。
print ++($foo = '99'); # prints '100' print ++($foo = 'a0'); # prints 'a1' print ++($foo = 'Az'); # prints 'Ba' print ++($foo = 'zz'); # prints 'aaa'
--
演算子にはこのような細工はない。
(配列のコンテキストにおける)範囲演算子は、
最小値と最大値が文字列の場合は ++
演算子の細工を利用している。
アルファベット文字の全てを得るためには次のように記述できる。
@alphabet = ('A' .. 'Z');
また、16 進の値を得るためには、
$hexdigit = (0 .. 9, 'a' .. 'f')[$num & 15];
そして、最初に 0 がついた日付を得るためには、
@z2 = ('01' .. '31'); print @z2[$mday];
と書ける。
(指定した最終値が ++
の細工が処理する順番になっていない場合は、
次の値が指定した最終値より長くなるまで繰り返される。)
||
や &&
は C のそれとは異なり、
0 や 1 を返す代わりに最後に評価した値を返す。このため、
ホームディレクトリを探すための移植性の高い方法は次のようになる。
$home = $ENV{'HOME'} || $ENV{'LOGDIR'} || (getpwuid($<))[7] || die "You're homeless!\n";
前章までに述べた文字や変数と同じく、 次章以降で述べる演算子は expression 中の"語"として機能する。 演算子の中にはリストを引数に取るものがある。 このリストはスカラーの引数や配列値が任意に結合されたものである。 配列値は、 リストのその位置に個々の要素を書いて 1 次元の配列値をたくさん生成したような形で リストに吸収される。
リストの要素はコンマで区切る必要がある。
演算子をリストすると、引数の前後に括弧がある場合ない場合共に、 その演算子を単項演算子または関数呼び出しとして使うことができる。
関数呼び出しとして使う場合は、 同じ行の次のトークンは左括弧でなくてはならない(間にスペースがあってもよい)。 このような関数は期待通りの最も高い優先度を持つ。
左括弧以外のトークンが続く場合は、単項演算子として扱われ、 リストを引数に取る演算子かそうでないかのみにより優先度が決まる。 リストを引数に取る場合は最も低い優先度になる。 他の全ての単項演算子は関係演算子よりは高いが数値演算子よりは低い優先度になる。 優先度の章を参照のこと。See section 優先度.