スカラ変数には、数値、文字列、リファレンスのような、さまざまな種類の単独 データを保持することができます。一般に、1つの形式から他への変換は透過的 です。(スカラに複数の値を保持することはできませんが、複数の値を持ってい る配列やハッシュへのリファレンスを保持することができます。)スカラの値ど うしは、自動的に変換されるので、スカラを返す演算や関数では、コンテキスト が文字列を要求しているのか、数値を要求しているのかを意識する必要がないの です (実際は意識することができないのですが)。
スカラ値は、その値が空文字列か数値の 0 (あるいは同値な文字列 '') 以外の 場合には、ブール値の真として扱われます。ブール値が必要となるコンテキスト は、単に特別なスカラコンテキストとして扱われます。スカラのヌルには、実は defined と undefined の 2 種類があります。undefined のヌルは、エラーがあっ たときや、ファイルの終わりに達したとき、初期化していない変数や配列要素を 参照したときなど、何かに対する実際の値が存在しないときに返されます。 undefined のヌルは、最初に defined であるかのように使ったときに defined となり得ますが、それに先立って値が defined かどうかを調べるために defined() 演算子を使うことができます。
配列の大きさはスカラ値です。配列 @days
の大きさは、csh のように
$#days
を評価するとわかります。(実際は、これは大きさではなく、最
後の要素に対する添え字になります。(通常は) 0 番目の要素があるからです。)
$#days
に代入を行なうと、配列の大きさも変化します。この方法で配列
を小さくすると、見えなくなった部分の値は破壊されます。小さくした配列を再
び大きくしても、以前存在した要素に対する前の値が回復することはありません。
(Perl 4 では回復可能でしたが、デストラクタが期待どうりの時点で呼ばれるこ
とを保証するために、これを止めました。)大きくなるであろう配列を、あらか
じめ大きくしておくことで、ある程度の効率を得ることもできます。(最後の要
素よりも後ろに離れた位置に代入を行なうことでも、配列を大きくすることがで
きます。)配列に空リスト () を代入すると何も無い状態にまで、切り詰めるこ
とができます。以下の 2 つは等価です:
@whatever = (); $#whatever = $[ - 1;
名前のある配列をスカラコンテキストで評価すると、配列の大きさが返されます。 (これは、リストに対しては成り立ちません。この場合には、C のコンマ演算子 と同じく最後の値が返されます。)以下は常に真となります:
scalar(@whatever) == $#whatever - $[ + 1;
Perl version 5 では $[
の意味を変更し、$[
を設定していない
ファイルで、他のファイルがこの変数を変更しているかどうかを、気にする必要
がなくなりました。(言い換えると、$[
は使わないほうが良いと言うこ
とです。)ですから、普通は以下のようになります。
scalar(@whatever) == $#whatever + 1;
ハッシュをスカラコンテキストで評価した場合、ハッシュの中に1つでも
key/value のペアが登録されているときにだけ、真となる値が返されます。
(key/value のペアが登録されていれば、返される値は、使用しているエントリ
の数と、割り付けられているエントリの数を、スラッシュで区切った文字列です。
これは、与えたデータに対して、Perl の (コンパイルされた) ハッシュのアル
ゴリズムが、うまく動作しないかを確認するときくらいにしか使えませんが。た
とえば、ハッシュに 10,000 のものを入れ、%HASH
をスカラコンテキス
トで評価したときに "1/16" が得られれば、16 のうち 1 つのエントリだけが使
われ、おそらくそこに 10,000 すべてが入っていることを意味します。ほとんど
起こりそうもないことですが。)
Go to the first, previous, next, last section, table of contents.