Go to the first, previous, next, last section, table of contents.


スカラ値

スカラ変数には、数値、文字列、リファレンスのような、さまざまな種類の単独 データを保持することができます。一般に、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.

検索式: