あどけない話

インターネットに関する技術的な話など

リテラル

文字列リテラル正規表現リテラルの区別がついてない人がいましたので、ちょっとだけ説明します。(僕も昔はそうでした。^^;)

そもそも「リテラル」とは、あるデータ型をプログラムの中に直接書き下せる形式のことです。

別の言葉で言えば、そのデータを作るために関数などを呼び出す必要がないということです。

ちょっと例を挙げてみましょう。

ハッシュ

たとえば、C言語でハッシュを実装したとします。C言語には ハッシュのリテラルがないので、ハッシュを生成するには、関数を呼び出さないといけません。

JavaScript には、基本データ構造としてハッシュがありますし、そのリテラルもあります。ですから、プログラムに直接書き下せます。

var hash = {
  key1: "val1",
  key2: "val2"
};

数値

C言語には、数値のリテラルがあります。当たり前過ぎて、リテラルだとも思っていない人が多いでしょう。

int i = 123;

でも、とても大きな数値を扱おうとすると、多バイト演算ライブラリを使うことになります。すなわち、大きな数値はプログラム中に書き下すことはできないのです。

Bignum のある Lisp なら、プログラム中に大きな整数を記述することができます。

(define bignumber 12345678901234567890123456789012345678901234567890)

正規表現

正規表現は、正規表現であって、文字列ではありません。両者は似ていますが、別物です。

正規表現リテラルを最初に導入したのが Perl なのか定かではありませんが、その存在を有名にしたのは、間違いなく Perl でしょう。

Perl では、

/\w+: \w+/

は、正規表現リテラルですが、

"\w+: \w+"

は、文字列リテラルです。

Perl 以前の言語では、正規表現リテラルがなく、文字列リテラルを使って正規表現を表していました。文字列はまず文字列として評価され、その後、正規表現エンジンに渡されます。文字列として評価された後もバックスラッシュが残るようにするには、バックスラッシュをバックスラッシュでエスケープする必要があります。ですから、バックスラッシュのお化けになります。

"\\w+: \\w+"

Perl では、正規表現リテラルなので、バックスラッシュを重ねる必要はありません。また、丸括弧などのよく使われるメタ文字もバックスラッシュを使わないで済むように設計されているので、バックスラッシュがあまり現れず、読みやすいのです。