#7 リテラル (スカラーリテラル:文字列と数値)

リテラルとは

基本的にはプログラムというのは値は何かしらから算出されるものなのですが、値を直接プログラム中に書きたい場合は多々あります。

そのため、基本的な値に関しては特定の書式に従うことで値を生成できるようになっています。 次の例は仮想言語ですが、

$hello = String[Hello, World]

と書くことで文字列Hello, Worldを生成できるとして、その場合はString[...]というメソッド1文字列を返すために$helloという変数にその文字列が格納されることになります。

これをリテラルを使うことで

$hello = "Hello, World"

とすれば、文字列リテラル"Hello, World"Hello, Worldという文字列を返すため、同じ結果を得ることができます。

文字列リテラル

基本(クォート記号によるもの)

文字列リテラルは一般的にクォート記号を使用します。

Perlの場合、""(ダブルクォート)または''(シングルクォート)で囲みます。

ダブルクォート中の文字列は、", $, \が特別な意味を持つ文字として扱われます。 "文字列の終端、$変数とみなされます。

\は続くものが通常の文字(アルファベット)であるならば、その文字によっては特別な意味に変換します。たとえば\nによって改行を表すことができます。 続くものが記号であるならば、その記号が特別な意味を持つ場合はその効果を打ち消します。 なにも意味を生じない場合は単純に無効化され、文字列からは消えます。

シングルクォートの場合は特別な意味を持つものは'のみに限定されます。特別な解釈をされたくない場合にシングルクォートを使用します。ただし、'をエスケープ(無効化)するために\'と書くことは許されています。もしも\を最後に置きたい場合は\\と書く必要があります。

基本的にダブルクォートとシングルクォートの区別がある場合はシングルクォートのほうが囲まれているものを特別な解釈をしないものになります。

Rubyもほとんど同じですが、変数$nameがなく、式埋め込み#{...}があるため、特別な意味を持つものは", #{ ,\になります。

JavaScriptはこれとは異なります。シングルクォートとダブルクォートで効果の違いはありません。 変数展開や式埋め込みはなく、\とシングルクォートまたはダブルクォートのみが特別な意味を持ちます。 また、PerlとRubyは文字列リテラルに改行文字(\nではなくリテラル中で実際に改行する)を含めることができますが、JavaScriptは含むことができません。

自由な区切り文字による入力

PerlとRubyは文字列'"の両方を含むような場合のために、特別な区切り文字を使う方法が提供されています。

perlの場合、q{...}形式とqq{...}形式があります。 qはシングルクォート、qqはダブルクォートに相当する展開を行います。 区切りとしては{...}に限らず、あらゆるASCII記号を使うことができます。 カッコのように左右に対応するもののある記号の左側で開始した場合は、その右側(閉じカッコ)で終端します。 それ以外の記号で開始した場合は、同じ記号がきたときに終端します。

Rubyの場合も同様ですが、%qまたは%Qを使用します。

長文をリテラルで埋め込みたい場合には便利です。

ヒアドキュメント

PerlとRubyには改行を含む長文をリテラルで書きたい場合のためにヒアドキュメントがあります。

これは<<WORDの形式を取り、WORDだけの行がくるまでを文字列とみなすします。 WORD"WORD"とするとダブルクォート相当に、'WORD'とするとシングルクォート相当になります。 囲まない場合の解釈には揺れがありますが、PerlとRubyは共にダブルクォート相当に扱います。

<<EOF
複数行に渡る
長い
なっがーい
文字列です
EOF

さらに<<に代えて<<-と書くことでWORDの前にスペースを置くことができます。

x = <<-EOF
複数行に渡る
長い
なっがーい
文字列です
    EOF

(本来はインデントに合わせるためのものであり、このEOFを置く位置としては適切ではありません)。

ヒアストリング

稀にヒアストリングという機能を持つ言語もあります。 一般的には行末までを文字列だとみなします。2

<<< 長い長い改行のない文字列を改行まで文字列とみなします

数値リテラル

普通の数値

Perl, Ruby, JavaScriptいずれも数字を並べると数値リテラルになります。

明示的な正数や負数も書くことができます。

PerlやRubyでは大きな数をわかりやすいようにするため、_を含めることができます。

このため、Rubyでは数字で始まり数字とアンダースコアからなる変数名、JavaScriptでは数字のみからなる変数名を使うことはできません。

整数リテラルに加え小数リテラルもあります。

16進数

コンピュータ的に表現する場合には2進数8桁を1桁で表現する16進数が便利です。

9の次はAで、Fまでいって10になります。

16進数を表すには0xを前置します。

8進数

2進数3桁を表現する8進数はほとんどの場合ASCII文字を表すためにしか使いませんが、コントロール文字の入力などのために稀に入力することになります。

8進数を表すには0を前置します。Rubyにおいては0oを前置することでも表現できます。

2進数

0, 1, 10, 11, 100…とカウントしていく2進数を表現する場合、0bを前置します。3

その他の数値リテラル

eまたはEを用いた指数記法を使用することができます。

また、Rubyには有理数、複素数、虚数部が有理数の複素数のリテラルもあります。

Rubyにおいては2/8/16進数と共通の記法で10進数を表すための0bもあります。

基数?16進数?

2進数、16進数といった基数に対する理解を深めたい方は 公開されている教材 をお読みください。


  1. まぁ、この場合意図としてはこれ全体がメソッドなわけではなく、Stringクラスの[]メソッドということになるのですが

  2. ZShellにはヒアストリングがありますが、シェルにおいては「標準入力に与える文字列リテラル」と異なる意味になっているため、「継続する1ワードを標準入力から与える」というまた違った意味になっています。

  3. なお、0xf92a = 0174452 = 0b1111100100101010 = 63786です。