3. 値、変数


3.1 値と変数

poitner 入門で書いたとおり(あるいはこれから書くとおり)、 pointer は 5、321、3.14 といった整数や実数、 "data/aaa.dat" や "x-axis" といった文字列を扱うことができます。 一方で読み込んだデータやウィンドウなども同じように、 変数に代入したりすることができます。
pointer では以下のような値を扱っています。 pointer ではこれらの値を特に区別なく変数に代入できます。 perl などではリストの変数名は @ ではじまりますが、 pointer ではリストの変数も $ ではじまります。
また、定義されていない変数を使ったり、 コマンドの実行に失敗したりした場合には、 pointer は undef という値を返します。

3.2 文字列

文字列は基本的に "(ダブルクオート)あるいは '(シングルクオート)でくくります。 もっとも、入門編で見たように文字列を クオートでくくる必要のない場合もあります。
open a.dat
のように、コマンドの後ろの引数はふつうクオートでくくらなくとも 文字列とみなされます。 クオートなしの文字列で問題が生じるのは、 それがコマンドとして受けとられてしまう場合です。 たとえば変数に代入する場合、
$a=hello
とすると、pointer は $a に文字列 "hello" を代入するのではなく コマンド hello を実行してその結果を $a に代入しようとします。 同じように、コマンドを関数風に書いた場合(後述)も、 たとえば
open(datafile)
と書くと、まず datafile というコマンドを実行しようと してしまいます。 こういった場合にはクオートは省けません。

シングルクオートとダブルクオートの違いは、 変数を展開するか否かです。 $a が "tmp" という文字列であった場合、 "$a/test.dat" は tmp/test.dat という文字列に展開されますが、 '$a/test.dat' は $a/test.dat(ここでの $ は単なる文字)という 文字列を表します。 その他の点では両者に違いはありません。 どちらの表し方でも、 "\n" のようなエスケープ文字が使えます。 (ただし、今のところ "\x0a" のような8進、 16進で文字を表すエスケープ文字は使えません。 おりを見てなおします)。


3.3 さまざまな演算子

演算子というと大げさですが、 + や -、= といった記号のふるまいを説明します。

+ と - はもちろん、足し算と引き算をします。 整数同士の足し算は整数に、 どちらか一方でも実数であれば結果は実数になります。 *、/ も同様です。 他の言語でもそうですが、 整数を整数で割ると答えも整数となるので、 4/3 は 1.333... ではなく、切り捨てられて 1 になります。
また、文字列同士を +、- などで結んだ場合には 全体を文字列とみなします。 たとえば、"sample"/"data.dat"sample/data.dat という文字列になります。

= は他の言語と同様、変数への代入を表します。 また、1+2 という演算が 3 という値を持つように、 $a=5 という代入演算も 5 という値を持ちます。 他の言語でも同様ですが、pointer でもすべての 演算やコマンドは何らかの値を返します。
また、$a=$a+3 のようにある変数に足し算などをして 元の変数に戻すという計算はよく使われます。 これらは(perl や c 言語同様)もっと簡単に $a+=3 と書くことができます。 同じように -=、*=、/= も用意されています。


3.4 インクリメント演算子

変数の値を 1 増やす、あるいは減らすという作業は 非常に頻繁に行なわれるので、 このための演算子、インクリメント演算子と デクリメント演算子が用意されています。 これらはそれぞれ ++ と -- と書き、 たとえば $i++ とすると 変数 $i の値が 1 増やされます。 整数、実数以外の変数に使った場合にはなにもおきません。 (たぶん。もしかしたら配列やリストに使った場合、 すべての要素についてインクリメントするように するかもしれません)。
また、この演算子は変数名の前からも後ろからも演算させられますが、 どちらから演算させるかによって式の値が異なります。 いま $i が 5 のとき、$a=++$i とすると $i も $a も 6 という値になりますが、 $a=$i++ とすると $i は 6 になりますが $a には 5 が代入されます。 インクリメントする前の値を返すか、 した後の値を返すかの違いがあるわけです。


3.3 比較演算子と真偽値

のちに説明する if ブロックで必要になりますが、 pointer でも二つの値の大小などを比べる比較演算子があります。 よく目にするところでは
$i<10($i の値は 10 より小さいか?)
$str=="yes"($str の中身は "yes" か?)
などです。 比較演算子は次の6つです。 (すべて c 言語を踏襲しています)。
これらの比較は真か偽かの値をとりますが、 pointer では真偽値を表す型はなく、整数で代用しています。 比較式は真なら 1、偽なら 0 という整数値を返します。 (実際には、0 以外の整数ならすべて真として扱われます)。 また、整数に限らず他の型の値を真偽値として使うこともできます。 文字列であれば t, T, y, Y ではじまる文字列は真、 それ以外は偽です。 ファイルであれば、それが開かれていれば真。 リストの場合は最初の要素を真偽値として使います。
また、2つの項の比較ではありませんが、 ! という演算子は右側の項の否定をあらわします。 たとえば !("true") や !(1) は偽を表しますが、 !(1>4) は真を表します。