Elixir IO

# Elixir IO

## 概要
Elixir の IO について。

IO は初期設定の場合、 stdio 

## IO Module
http://elixir-lang.org/docs/stable/elixir/IO.html

IO はデフォルトでは標準入出力を扱います。

* puts で標準出力（改行付き）
* guts で標準入力（改行付き）

をします。
atom で

### サンプルコード

~~~
IO.puts "start"
answer = IO.gets "true or false "
IO.puts answer
case answer do
  "true\n" ->
    IO.puts "you choose true"
  "false\n" ->
    IO.puts "you choose false"
  _ ->
    IO.puts :stderr, "you have to choose true or false"
end
~~~

### 試行
~~~bash
$ elixir io.exs
start
true or false true
true

you choose true
$ echo $?
0

$ elixir io.exs
fastart
true or false lse
false

you choose false
$ echo $?
0

$ elixir io.exs
start
true or false other
other
1

you have to choose true or false
** (exit) :seems_bad
    io.exs:11: (file)
    (elixir) src/elixir_lexical.erl:17: :elixir_lexical.run/3
    (elixir) lib/code.ex:316: Code.require_file/2
iex> IO.chardata_to_string([65,66,67])
"ABC"
~~~

### iex 試行

~~~bash
# codepoint を出力
iex> IO.chardata_to_string([65,66,67])
"ABC"

iex> ary = [1,2,3]
[1, 2, 3]
iex> IO.puts ary
^A^B^C
:ok

# pretty printing
iex> ary = [1, 2, 3]
[1, 2, 3]
iex> IO.inspect ary
[1, 2, 3]
iex> map = %{:key1 => "value1", :key2 => "value2"}
%{key1: "value1", key2: "value2"}
iex> IO.inspect map
%{key1: "value1", key2: "value2"}
%{key1: "value1", key2: "value2"}
~~~

## The File module
http://elixir-lang.org/docs/stable/elixir/File.html

File module はその名の通りファイル操作を行うモジュールです。

### サンプルコード

~~~
{:ok, file} = File.open "hoge.exs", [:write]
IO.binwrite file, "IO.puts 'hoge'"
File.close file
IO.inspect File.read "hoge.exs"
~~~

### 試行

~~~
$ elixir file.exs
warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell)
{:ok, "IO.puts 'hoge'"}
~~~

### iex 試行

~~~
# カレントディレクトリを取得
iex> File.cwd
{:ok, "/home/vagrant/samples/12"}
# ディレクトリを移動
iex> File.cd("../")
:ok
iex> File.cwd
{:ok, "/home/vagrant/samples"}
# 存在チェック
iex> File.exists?("13")
false
# ディレクトリの作成
iex> File.mkdir("13")
:ok
iex> File.exists?("13")
true
# ファイル・ディレクトリリスト
iex> File.ls
{:ok, ["13", "12", "11", "10"]}
# 更新時間・アクセス時間を更新。ファイルがなければ作成する
iex> File.touch("tmp_hoge")
:ok
iex> File.ls
{:ok, ["13", "12", "tmp_hoge", "11", "10"]}
# ファイルの削除
iex> File.rm("tmp_hoge")
:ok
iex> File.ls
{:ok, ["13", "12", "11", "10"]}
~~~

## Path module
http://elixir-lang.org/docs/stable/elixir/Path.html

ファイルパスに関わるモジュール

### iex 試行

~~~
# 絶対パスの取得
iex> Path.absname("hoge.exs")
"/home/vagrant/samples/12/hoge.exs"
iex> File.touch("../hoge.txt")
:ok
# ファイル名の取得
iex> Path.basename("hoge.exs")
"hoge.exs"
iex> Path.basename("/home/vagrant/samples/12/hoge.exs")
"hoge.exs"
# ファイル名の取得（拡張子抜き）
iex> Path.basename("/home/vagrant/samples/12/hoge.exs", ".exs")
"hoge"
# ディレクトリ名の取得
iex> Path.dirname("/home/vagrant/samples/12/hoge.exs")
"/home/vagrant/samples/12"
# 絶対パスに展開
iex> Path.expand("../hoge.txt")
"/home/vagrant/samples/hoge.txt"
# 拡張子の取得
iex> Path.extname("hoge.exs")
".exs"
# リストからパスを取得
iex> Path.join(["/","home","vagrant","samples","12","hoge.exs"])
"/home/vagrant/samples/12/hoge.exs"
# 2つのパス文字列を結合してパスを取得
iex> Path.join("/home/vagrant/samples/12", "hoge.exs")
"/home/vagrant/samples/12/hoge.exs"
# パスを各ディレクトリ、ファイルからなる配列に分割する
iex> Path.split("/home/vagrant/samples/hoge.txt")
["/", "home", "vagrant", "samples", "hoge.txt"]
# ワイルドカード検索
iex> Path.wildcard("*.exs")
["file.exs", "hoge.exs", "io.exs"]
~~~

## 参照
* http://elixir-lang.org/docs/stable/elixir/IO.html
* http://elixir-lang.org/docs/stable/elixir/File.html
* http://elixir-lang.org/docs/stable/elixir/Path.html
* http://elixir-lang.org/getting_started/12.html