特殊文字(エスケープシーケンス)
文字や数値の使い方を簡単に見てきましたが、テキストとして入力を行えない特殊な文字があります。簡単な例で言えば改行です。テキストエディタ上でEnterキーを押してもテキストが改行されるだけで改行を表す文字としては入力ができません。
このような特殊な文字を入力するために「¥」記号+1文字などを使い別の単語として記述することができます。このような特殊な記述の仕方をエスケープシーケンスと言います。
よく利用されるものでは次のようなものがあります。
¥a 警報音 ¥b バックスペース ¥n 改行 ¥r 復帰 ¥f 改ページ ¥t 水平タブ ¥e ESC ¥¥ 文字としての¥ ¥$ 文字としての$ ¥@ 文字としての@ ¥; 文字としての; ¥' シングルクォーテーション(') ¥" ダブルクォーテーション(") ¥ooo 8進数 ¥xhh 16進数 ¥cX コントロール文字(¥cCならCtrl+C) ¥l文字 文字を小文字 ¥u文字 文字を大文字 ¥L...¥E ...を小文字 ¥U...¥E ...を大文字 ¥Q...¥E ...の中のメタ文字をエスケープ
エスケープシーケンスは文字列を構成する1つの文字として文字列の中に他の文字と組み合わせて記述することができます。代表的なものとしては改行の「¥n」があります。文字列を定義する時に改行したい位置に「¥n」を記述することで改行を行わせることができます。
"こんにちは¥nおはようございます"
上記を出力すると次のように表示されます。
こんにちは おはようございます
なおエスケープシーケンスが特別な解釈をされるのは文字列がダブルクオーテーションで囲まれている場合です。例えばシングルクオーテーションで文字列を囲った場合に、エスケープシーケンスが記述されていても一部の例外を除いてそのままの文字として解釈されます。
'こんにちは¥nおはようございます'
上記を出力すると次のように表示されます。
こんにちは¥nおはようございます
今回の場合は文字列中に含まれる「¥n」は改行という意味ではなく「¥」と「n」と言う文字がただ並んだものとして解釈されます。
シングルクオーテーションで囲まれた文字列の中でエスケープシーケンスとして意味を持つものは「¥'」と「¥¥」だけです。
サンプルプログラム
では簡単なプログラムで確認して見ます。
use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; print "こんにちは¥nおはようございます¥n"; print 'こんにちは¥nおはようございます¥n';
上記を「test4-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
同じ文字列を出力していますが、最初の文字列はダブルクオーテーションで囲まれているため文字列中の「¥n」が改行として解釈されて出力されています。次の文字列ではシングルクオーテーションで囲まれているため文字列中の「¥n」はそのままの文字として出力されています。
「¥」や「"」を表示する
エスケープシーケンスではキーボードから入力しにくい文字を別の単語として表す利用方法の他に、キーボードから入力はできるけれども他の理由で表示できない文字を表す場合にも使われます。
まず「¥」そのものを文字として表示したい場合です。文字列の中に「¥」と「n」が続けて記述された場合を考えて下さい。
"abcd¥nefg"
文字として「¥」を表示したいにも関わらず「¥n」が改行を表すエスケープシーケンスとして扱われてしまうためこの文字列は次のように解釈されます。
abcd efg
そこで「¥」をエスケープシーケンスの特殊な文字としてではなく単なる文字として扱いたい場合には「¥¥」と記述します。
"abcd¥¥nefg"
今回の場合は「¥¥」が「¥」と言う文字として扱われますので次のように解釈されます。
abcd¥nefg
同じように「"」文字を文字列の中で使用しようとすると、文字列の終端を表す「"」と区別するために「¥"」のように記述することで文字として「"」を扱うことができます。
サンプルプログラム
では簡単なプログラムで確認して見ます。
use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; print "abc¥ndef¥n"; print "abc¥¥ndef¥n"; print "aaa¥"bbb¥n";
上記を「test4-2.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
エスケープシーケンスとして特別な意味を持つ「¥」や、文字列を定義する時に使用される「"」も表示することができます。
( Written by Tatsuo Ikura )