perl には 3 種類のデータ型 : スカラー、スカラー配列、および連想配列がある。 通常の配列は添え字が数字だが、連想配列の場合は文字列である。
perl における演算や値の解釈は、 演算や値のコンテキストからの要求に依存することがある。 主なコンテキストには 3 つ : 文字列、数値、および配列がある。 演算の中には、配列を要求するコンテキストでは配列を、 そうでなければスカラー値を返すものがある。 (そのような演算子についてはそのドキュメントに記述されている。) スカラー値を返す演算子は、 コンテキストが文字列あるいは数値のどちらを要求しているかは考慮しないが、 スカラー変数およびスカラー値は 文字列あるいは数値のコンテキストのふさわしい方に解釈される。 スカラーはそれがヌル文字列あるいは 0 でなければ論理的に真であると解釈される。 演算子が返す論理値は真の場合は 1、 偽の場合は 0 または '' (ヌル文字列)である。
実は、ヌル文字列には 2 種類ある。
define されたもの、undefined のものである。
undefined のヌル文字列はエラーや、end of file や、
初期化されていない変数や配列要素を参照しようとした時など、
実際の値が存在しない時に返る。
undefined ヌル文字列は最初にそれにアクセスすることにより、
defined になることがあるが、その前に defined()
演算子を用いて
値が defined かそうでないかを知ることができる。
スカラー変数への参照は、それが配列の一部であっても、 常に `$' で始める。すなわち、以下の通りである。
$days # 単純なスカラー変数 $days[28] # 配列 @days の 29 番目の要素 $days{'Feb'} # 連想配列の値の一つ $#days # 配列 @days の最後の添え字
しかし、配列全部や一部の取り出しなどは '@' で始める。
@days # ($days[0], $days[1],... $days[n]) @days[3,4,5] # @days[3..5] と同じ @days{a,c} # ($days{'a'},$days{'c'}) と同じ
そして連想配列全部を扱うには、'%' で始める。
%days # (key1, val1, key2, val2 ...)
これら 8 つはすべて左辺値として扱うことができる。すなわち、代入可能である。
(さらに、あるコンテキストでは代入操作自体も左辺値となりうる。
s
、tr
および chop
における例を参照のこと。)
See section s/パターン/置き換え/,
See section tr/検索リスト/置換リスト/, and See section chop.
スカラーへの代入を行うと、右辺をスカラーのコンテキストで評価するのに対し、 配列や配列の一部への代入は右辺を配列のコンテキストで評価する。
配列 @days
の長さを、csh のように、
`$#days' で評価することができる(実際には、配列の長さではなく、
最後の要素の添え字である。なぜなら、通常 0 番目の要素があるからである)。
$#days
へ代入すると、配列の長さが変わる。
この方法により配列を小さくしても、実際には値は何も破壊されない。
すでに小さくした配列を大きくすると、もともとあった要素が元に戻る。
また、大きくなりそうな配列をあらかじめ大きくしておくと、
効率をいくらか良くすることができる。(配列を大きくするには、
配列の最後を超える要素に代入を行う方法もある。この方法と、
$#whatever
へ代入する方法との違いは、
間の要素にヌルがセットされることである。)
配列の中身を捨てて空にするには、ヌルリスト ()
を代入すれば良い。
次の二つは全く同等である。
@whatever = (); $#whatever = $[ - 1;
配列をスカラーのコンテキストで評価すると、配列の長さが返る。 次の式は常に真である。
scalar(@whatever) == $#whatever - $[ + 1;
連想配列をスカラーのコンテキストで評価すると、 配列が要素を含む場合かつその場合に限り真の値を返す。 (要素がある場合に返る値は文字列で、 使用している bucket の数およびアロケートされている bucket の数からなり、 スラッシュで区切られている。)
多次元配列は直接はサポートしていないが、
連想配列を用いて
複数の添え字をエミュレートする方法については $;
変数の項を参照のこと。
また、多次元の添え字を 1 次元の添え字に変換するサブルーチンを書くこともできる。
See section $; : 多次元配列エミュレーションの際の添え字の区切り.
各々のデータ型に応じて、それぞれの名前空間がある。 衝突を心配することなく、同じ名前をスカラー変数、配列、連想配列、 ファイルハンドル、サブルーチン名、またはラベルにつけることができる。
変数や配列への参照は常に $
、@
、%
で始まるので、
予約語は変数名については実際には使用可能である。
(しかし、ラベルやファイルハンドルについては予約語は使用できない。
特殊な文字で始まらないからである。
ヒント: `open(log,'logfile')' より `open(LOG,'logfile')' を
使った方が良い。
大文字のファイルハンドル名を使うと、読み易さも向上し、
将来予約される単語との衝突も避けることができる。)
大文字小文字の区別は重要である -- `FOO'、`Foo'、`foo' は
すべて異なる名前である。アルファベットで始まる名前は数字や下線を含んでもよい。
アルファベットで始まらない名前は 1 文字に限られる。
例: `$%' や `$$'。
(ほとんどの一文字名は perl の予約変数として意味がある。
Predefined Names
の項を参照。See section 予約変数).