Perl入門 ≫ LESSON3 文字(文字列)
文字(文字列)の基本
文字や文字列もデータとして扱うことができます。文字列は次のように表します。
"Mojiretsu"
'Mojiretsu'
'123'
ダブルクォート(")かシングルクォート(')で囲みます。
'123'もただの「123」だけなら数値の123ですが、↑の場合は文字列になります。
この二つ、どちらでもかまわないのですが、違いがあります。ダブルクォートを使うと変数やエスケープ文字を評価してくれます。(エスケープ文字については次を参照)
シングルクォートを使うと、変数やエスケープ文字を評価せずにそのままの文字列として評価されます。
評価ってなに!?と思うでしょうが、とりあえず試してみましょう。
my $moji = 'Hello';
my $hensu = "$moji\nWorld.";
print "$hensu\n";
my $hensu2 = '$moji\nWorld.';
print $hensu2;
結果は以下。
Hello
World.
$moji\nWorld.
おわかりでしょうか?
普通$で始まる部分は変数と判断されます。また、\nは改行を表すエスケープ文字です。
最初の$hensuにはダブルクォートで囲った文字列【変数$mojiと\nとWorld.を組み合わせた文字列】を代入しました。
変数$mojiと\nは評価されたので、変数$mojiの部分には先に定義した$mojiの値が入り、
\nは改行を表す文字として評価されたのです。
また、変数と次の文字がごっちゃになってどこまでが変数だかわからないことがあるので、そういう場合のために
"${moji}abc"
というように{}で変数名を囲います。
一方、シングルクォートで同じ文字列を囲った場合、変数$mojiと\nは評価されずにそのままただの'$moji'という5文字の文字列と'\n'という二文字の文字列として扱ってしまいます。
よって、変数$mojiの値は変換されず、\nは改行としてみなされません。
当然、{}で変数名を囲っても、{}までもそのまんま評価されてしまいます。
また、シングルクォートの代わりにq//で、ダブルクォートの代わりにqq//で囲うこともできます。
my $moji = 'Hello';
my $hensu = qq/$moji\nWorld./;
print "$hensu\n";
my $hensu2 = q/$moji\nWorld./;
print $hensu2;
結果は以下。
Hello
World.
$moji\nWorld.
同じですね。
エスケープシーケンス
エスケープシーケンスとは、逆スラッシュ”\”を直前に付けた文字のことです。(Windows環境では¥の半角文字になります)
それぞれ意味を持ち、評価された時にその意味通りに解釈されます。
\n | 改行 おそらく一番よく使うことになるでしょう。 |
---|---|
\r | リターン 一文字戻ります。 |
\t | タブ |
\f | 改ページ |
\b | バックスペース |
\v | 垂直タブ |
\a | ベル |
\e | エスケープ |
\053 | 8進で文字コードを指定[\で始まる8進数](この例は+) |
\x66 | 16進で文字コードを指定[\xで始まる16進数](この例はf) |
\cC | コントロール文字(この例はコントロールc) |
\\ | 逆スラッシュ |
\" | ダブルクオート |
\l | 次の一文字を小文字にする |
\L | これ以降、\Eまでを小文字にする |
\u | 次の一文字を大文字にする |
\U | これ以降、\Eまでを大文字にする |
\E | \Lと\Uの効果を終了させる |
my $hensu = "改行\nします。";
print $hensu;
結果は以下。
改行
します。
展開されるようにダブルクォートで囲って試してみてください。
たまたまエスケープシーケンスと同じ文字列になってしまったが、エスケープシーケンスとして扱って欲しくない場合は、展開しないシングルクォートで囲むか、\\で逆スラッシュを表すので、\の前にもう一つ\を付けてエスケープの意味を無効にして下さい。
エスケープ
たまたま、シングルクォートで囲った中にシングルクォート文字が出てきてしまう場合があります。ダブルクォートで囲った中でも同様です。
つまり、
$hensu = 'o'clock';
ってな場合ですね。
これは当然怒られます。
$hensu = "moji"retu";
これでも同じです。2回目のクォートで、文字列が終わったと判断してしまうので、そっから先が変だと怒られます。
シングルクォートで囲う間にダブルクォートを使ったり、その逆の場合は当然問題ありません。
が、どうしても同じ種類のクォートを途中で使いたい場合は、q//かqq//を使うか、中のクォートをエスケープ(文字の前に逆スラッシュを使う)します。
my $hensu = q/aa'aa/;
print "$hensu\n";
$hensu = 'o\'clock';
print "$hensu\n";
$hensu = "moji\"retu";
print "$hensu\n";
結果は以下。
aa'aa
o'clock
moji"retu
また、先ほどから例文のprintコマンドの部分で何度か使っていますが、最初に$がつく文字列は変数を表してしまうのですが、クォートと同様に逆スラッシュを前に付けると、ただの文字”$”であると判断してくれて、変数として展開しません。
困った時のエスケープ
実はPerlと日本語は割と相性が悪くて、日本語文字列"表示"をperlで出力させようとするとうまくいきません。(注)環境によります。あとはシングルクォートだと問題なし。
my $hensu = "表示";
print "$hensu\n";
ちょっとやってみて下さい。ヘンな文字が出ます。(実行環境によります)
他にもこういう文字はいくつか存在します。
この場合、”表”と”示”の文字の間に逆スラッシュを入れてみてください。おそらく上手くいきます。
何か表示がおかしい!という場合は、とにかく逆スラッシュを入れて文字をエスケープしてみて下さい。
文字の結合
文字を結合させるにはどうすればいいか?
前の項目でやったように、ダブルクォートで囲って続けて書きます。その時、変数名と他の文字がごっちゃにならないように{}で変数名を囲うのを忘れずに。
もう一つ、文字を連結する演算子があります。
”.”演算子で連結できます。
my $moji = 'Hello';
my $hensu = "${moji}World ${moji}";
print "$hensu\n";
my $hensu2 = $moji . 'World ' . $moji;
print $hensu2;
結果は以下。
HelloWorld Hello
HelloWorld Hello
また、+や-演算子と同様、”.=”で左に定義した変数に連結&代入することができます。
my $moji = 'Hello';
$moji .= " World.";
print $moji;
結果は以下。
Hello World.