*Luaライブラリ 要注意点 ~入出力ライブラリ~ [#b5c1a5a2] **printは最後に改行が付く、io.writeは改行が付かない。 [#t553fe49] >両方ともリストを引き受けるが、~ ~ ''print(リスト)はタブで連結し、最後は改行を付加。''~ ''printは常に標準出力。~ ~ ~''io.write(リスト)は純粋に連結するのみ。''~ ''io.writeは現在割り当てられている出力ハンドルが対象。切り替え可能。''~ ''(ファイルor標準出力or標準エラーなど、とにかく現在割り当てられているハンドル)'' **io.read (···) [#v9533761] >io.input():read(···) と同等。 |~引数|~説明| |"*all"|ファイル全体を読み込みます。| |"*line"|次の行を読み込みます。| |"*number"|数値を読み込みます。| |<num>|最大で<num>文字の文字列を読み込みます。| **効率の良い読み込みと出力 [#n5e142ef] >Luaにおいて、最も効率が良いのは、''全部を読み込んで、処理して、出力する''というもの。 #sh(lua]){{ t = io.read("*all") --> 一気に読み込む t = string.gsub(t, …) --> 何か処理 io.write(t) --> 出力 }} **Luaのデフォルトのファイル読み込み単位は「行」 [#a5c098f2] >次にio.read(*line)も良くある。*lineと指定しなくともread()のデフォルトはこの*lineである。~ 読み込むのは一行ずつだが、最後の改行はtrimされる。~ 一番最後に読み込むものが無くなれば、nilを返す。~ #sh(lua]){{ for count = 1, math.huge do -- 無限ループ local line = io.read() if line == nil then break end io.write(string.format("%6d ", count), line, "\n") end }} ただし、io.lines()イテレータを使用する方が自然である。 #sh(lua]){{ local lines = {} for line in io.lines() do lines[#lines+1] = line end table.sort(lines) for _, l in ipairs(lines) do io.write(l, "\n") end }} **io.read("*number") [#db8d5003] >io.read("*number") は数値入力を受け付ける。~ 前に空白系の文字があったら無視される。~ ~ ''一行に複数の数値が入っていることが期待される場合、その個数分だけ"*number"を記載すれば良い。'' #sh(lua]){{ data部 6.0 -3.23 15e12 4.3 234 1000001 io.read("*number", "*number", "*number") }} #sh(lua]){{ while true do local n1, n2, n3 = io.read("*number", "*number", "*number") if not n1 then break end --真ではない。nil or false print(math.max(n1,n2,n3)) end }}