引用符(クォート,クォーテーションマーク)について


■ シェルの引用符,Perl の引用符

下のようにコマンドラインに入力して,[ENTER] キーを押すと,"Hello.[改行]" と表示される。(% はプロンプト。)

%perl -e 'print "Hello.\n";'[ENTER]            
Hello.
%

1行目では2組の引用符が使われている。どちらも「Perl で使う引用符」と考えてしまうかもしれないが,' 'シェルに対するもので," "Perl に対するものである。

まずはシェル ...

' ' は下の下線部 a) が一まとまりのものであることをシェルに指示するものである。シェルはこれを一まとまりのものとして Perl に引き渡す。

   perl -e 'print "Hello.\n";'
          a)_________________
                 b)________

「スクリプト」部分が一まとまりのものだとわかればよく,下の例のように,引用符を付けなくとも一まとまりであることがわかるもの (そしてシェルに対する特殊文字を含まないもの) であれば,引用符を使わなくてもよい。

   perl -ne print longleg.txt
            _____

しかし,こういう単純なケースはあまりない (こういう作業なら,cat など他のコマンドを使う) ので,基本的に引用符で括ると考えておいた方が混乱しない。

シェルで使える引用符には " " もある。(' ' を使うか " " を使うかで,解釈に違いが生じるが,ここでは触れない。) 実際,次のように," " を使うこともできる。

   perl -ne "print;" longleg.txt

スクリプトを " " で括った場合,スクリプト内でそのまま " " を使うことはできなくなる。下のように書くと,シェルは二つ目の " を見つけた時点で,引用符が閉じられていると解釈してしまい,それ以降を別の要素と見なしてしまう。

   perl -e "print "Hello.";"
          a)______           ... print 
                 b)______    ... Hello.
                        c)_  ... ;

話を簡単にするため,最初は ' ' でスクリプトを囲むとしておく。

そして Perl へ ...

シェルから下線部 a) を渡された Perl は,直前にオプション -e があるので,ここをスクリプトと解釈する。

   perl -e 'print "Hello.\n";'
          a)_________________
                 b)________

スクリプト内に引用符があれば,Perl は Perl の文法に従い解釈する。下線部 b) は " " で囲まれているので,この部分が文字列と解釈する。文字列をどう解釈するかは,引用符の種類によって異なる。


■ 引用符の種類と機能

Perl で使える引用符は複数あり,どの引用符を使うかで文字列の解釈が変わる。

"文字列"
(double quote)
変数は値に展開される。また [改行] を表わす \n,[タブ] を表わす \t などのメタ文字が使える。変数展開したくない場合には,\$var のように \ でエスケープする。

'文字列'
(single quote)
基本的に「文字列」で書いた通りに解釈される。変数の展開は行わない。', \\', \\ で表わす。[改行] を表わす \n などのメタ文字は使えない。

`文字列`
(back quote)
変数展開が行われ,その結果をコマンドとして実行し,その出力結果を値として返す。

表にまとめると次のようになる。

  変数の展開 メタ文字の解釈コマンドの実行
 " (double quote)×
 ' (single quote)×××
 ` (back quote)


■ クォート風演算子

Perl には上記クォートと同じ働きをする演算子がある。以下に一覧を示す。(/ /# #, ( ), { } のように他の区切り文字に変えることができる。)

   変数の展開 メタ文字の解釈コマンドの実行
 qq/ /  " " ×
  q/ /  ' ' ×××
 qx/ /  ` ` 

コマンドラインで ' ' で囲んで指定したスクリプトを実行する際,スクリプト内で ' ' (相当の機能) を使いたいときなどに利用すると便利である。また,例えば qq/ / を使った場合,文字列中でエスケープせずに " が使えるようになるので,クォート文字が含まれる文字列を扱うときに使うとわかりやすくなる。

「リスト」(Lesson 6 参照) の要素として文字列を指定する場合にクォートを用いるが,qw/ / を用いると,スペースで区切られた文字列をリストの各要素として扱ってくれるので,すべての要素を引用符で囲み,コンマで区切る必要がなくなる。

   qw/Sun Mon Tue Wed Thu Fri Sat/

   ← "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" に相当

文脈によっては,qw/ / 全体を ( ) で括る必要がある。

   ( ) が不要な例
   --------------------------------------------------
   @array = qw/Sun Mon Tue Wed Thu Fri Sat/;
   print $array[1];      #Mon を出力
   --------------------------------------------------

   ( ) が必要な例
   --------------------------------------------------
   print (qw/Sun Mon Tue Wed Thu Fri Sat/)[1];  #Mon を出力
   --------------------------------------------------