下のようにコマンドラインに入力して,[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 を出力 --------------------------------------------------