<Lua> 標準出力と標準エラー出力に文字列を出力する

Last modified: 2019-07-21

ここではLuaのインタプリタを用いたスクリプトファイルで標準出力と標準エラー出力に文字列を出力する方法とそのコード例を扱う。

今回は最初のコード例なので、コメントについてやプログラムの実行についてもふれている。

標準出力や標準エラー出力に文字列を出力する関数

関数print()とio.stdout/io.stderrのメンバ関数write()

関数print()は引数の文字列の後ろに改行文字を付けて標準出力に出力する。

print('Hello')

これとは別に、io.stdoutに対してwrite()というメンバ関数を呼び出すことで引数の文字列を標準出力に出力することもできる。この場合は後ろに改行文字は付かない。改行文字を後ろに付けたい場合は末尾に改行文字\nを記述する。

メンバ関数呼び出しの書式

Luaはデータ型によってはメンバ関数(その変数に対しての操作を行う関数)が利用できるようになっており、変数とメンバ関数名の間に.ではなく:を付ける

例として、標準出力を扱うためのio.stdoutに対してwrite()というメンバ関数を呼び出す場合は

io.stdout:write('Hello\n')
のようになる。

標準エラー出力への文字列の出力

標準エラー出力に文字列を出力するには上のio.stdoutの代わりにio.stderrwrite()を呼び出す。後ろに改行文字を付けたい場合に\nが必要なのも同様。

io.stderr:write('Error message\n')

なお、厳密にはLuaは言語の基本的な機能として直接オブジェクト指向プログラミングに対応しているわけではなく(実装は可)、正式なものとしての “クラスのメンバである関数” という形ではないが、今後も変数に対する操作として:付きで呼び出す形の関数は “メンバ関数” という表記を行うものとする。

コード例

コードファイルに実行属性を付けて直接実行したい場合はコード先頭行の/usr/bin/luaの部分を必要に応じて環境に合わせる。LuaJITを用いて動かす場合は環境に応じて/usr/bin/luajitなどにする。

[任意]ファイル名:001_hello.lua エンコーディング:UTF-8

#! /usr/bin/lua
-- -*- coding: utf-8 -*-

--[[--  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
動作確認バージョン: 5.3, JIT2.1
--  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --]]

-----
----- 標準出力と標準エラー出力に文字列を出力
-----

-- print()関数に文字列を渡すと
-- 標準出力に引数/引き数(括弧内で渡した内容)の文字列が改行付きで出力される
-- print()の引数は1つで、出力したい文字列の内容となる
-- 関数の呼び出しは基本的には「[関数名] ([引数...])」となる
print('Lua !!')

-- io.stderr:write()を用いると標準エラー出力に出力することができる
-- 改行は付かないが「\n」を末尾に記述すると改行ができる
-- 「:」はメンバ関数の利用可能なデータ型において
-- 「[変数]:[メンバ関数名] ([引数...])」の形で用いる
-- (この場合はio.stderrのメンバ関数write()を呼んでいる)
io.stderr:write('標準エラー出力に書き出すこともできます\n')

-- io.stdout:write()で標準出力に対して同様に出力することもできる
io.stdout:write('標準出力を指定して書き出すこともできます\n')

-- 終了

下は実行例。端末シェルの中から動かす。

$ lua [001_hello.luaの場所]
Lua !!
標準エラー出力に書き出すこともできます
標準出力を指定して書き出すこともできます

$ lua [001_hello.luaの場所] > /dev/null
標準エラー出力に書き出すこともできます

$ lua [001_hello.luaの場所] 2> /dev/null
Lua !!
標準出力を指定して書き出すこともできます

Luaのコメントについて

上のコードにもあるが、コード中に--を記述すると、その右側が行末までコメントとして扱われ、動作上無視される(動作に影響しない)。

ただし、--のすぐ後ろが2文字連続した[となる場合は無視される範囲が行末までとはならず、次に2文字連続した]が現れるまでの範囲がコメントとして扱われる。これは複数行をコメントとしたい場合に用い、複数行コメント開始の

--[[

と複数行コメント終了の

]]

ではさむことで、複数行の領域の一時的な動作無効化が簡単にできる。

  • 使用したバージョン
    • Lua 5.3.3
    • LuaJIT 2.1.0 Beta 3