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) は真を表します。