kazayomi::lua::0003

The 文字列いじり


<-Prev(0002) [0003] Next(0004)->

前節で話文字列について、もうちょっと突っ込んでみます。

前節では文字列を、
"文字列"
と記述し、\はエスケープ文字であると話しました。

それでは、バックスラッシュ(円記号)そのものを書きたい時や、
改行をいくつも含む、かなり長い文章を書きたい場合は、
どうすればいいでしょうか?

解決法は1つだけではありません。

以前話した様に\はエスケープ文字と言って、
これに続く文字と一緒になって特別な意味を持ちますが、
バックスラッシュでバックスラッシュをエスケープすると、
1つのバックスラッシュとして表示できます。

つまり、
io.write("\"\\\"\n")
と書けば、
"\"
と表示されます。
(1つ目の\が"をエスケープして二重引用符、
2つ目の\が3つ目の\をエスケープしてバックスラッシュ、
4つ目の\が"をエスケープして、もう一度二重引用符、
5つ目の\がnをエスケープして改行。)

次に、長い文章を出力させたい場合の例として、
Good Morning, World!
Good Afternoon, World!
Good Evening, World!
と出力させたいとしましょう。

\nで改行を表す事ができると知っているので、1行で書いちゃう事ができます。

[greet.lua]
io.write("Good Morning, World!\nGood Afternoon, World!\nGood Evening, World!\n")

こう書けると知っていても、こう書きたくないというのが本音でしょう。
当然の事ですが、関数の呼出しを数回に分けて書く事もできます。

[greet2.lua]
io.write("Good Morning, World!\n")
io.write("Good Afternoon, World!\n")
io.write("Good Evening, World!\n")

1行で書くよりも文字の量は増えたかも知れませんが、
最初よりもよっぽどスッキリしました。

ところでLua言語には、長い文章を埋込みやすくする為の、
ブロック文字列という構文が用意されています。

書きかたは、
[[複数行にまたがる
...(略)
長い文字列]]
のように、2つのブラケット(各括弧)[[と]]の対で挟みます。

二重引用符(")の対の中で、改行すると、文法エラ−になってしまいますが、
[[と]]の中で改行しても、そのまま改行文字として認識してもらえます。
(この文字列ブロックの中ではエスケープ文字は働かないということに注意。
また、ブロック内では二重引用符も直接書けるので便利。)

しかし、[[の直後の改行のみは改行文字として認識されません。
文字列の塊が分かりやすくなる為の考慮のようです。

これを利用してプログラムを書きなおすと、
[greet3.lua]
io.write ([[
Good Morning, World!
Good Afternoon, World!
Good Evening, World!
]])
非常にスッキリしました。

文字列の最後で改行してから]]と書かないと、
最後の最後に改行されずに前節の最後の例みたいに、
ちょっとだけ嬉しくない事が起こります。

ところで、io.writeは正式な文字列出力用の関数なんですが、
printという名前の単純な関数も用意されています。
io.writeとほとんど同じ動作をしますが、
最後の最後に自動的に改行文字を付け加えます。

この動作が嬉しい場合もあれば、余計な事すんな!って場合もありますが、
こういうサンプルプログラムやデバッグ用途の出力には、
役立つ事の方が多いので、今後はこちらを優先に使う事もありますが、
混乱しないように御願いします。

更にもう1つだけ付け加えると、
関数呼びだしの時に、引数として文字列1つ(文字列変数はダメ)だけを与える場合のみは、
関数 文字列引数
という構文が許され、パーレン(丸括弧)"(と)の対"を省略する事ができます。

以上の事を踏まえて、最終的にこの挨拶プログラムを書きなおすと、
[greet4.lua]
print [[
Good Morning, World!
Good Afternoon, World!
Good Evening, World!]]
スッキリ!

次回は変数について部分的に取り上げようと思います。

<-Prev(0002) [0003] Next(0004)->