Ruby の Kernel#gets や ARGV、ARGF、STDIN、$stdin について
- ARGV
- 引数の配列。
--
で区切って記述しないと、スクリプトの引数ではなく Ruby の引数と判断される場合がある
- 引数の配列。
- ARGF
- ARGV の各引数をファイルパスとみなし、それらのファイルを連結した 1つの仮想ファイルを表すオブジェクト。ARGV が空なら
$stdin.gets
する。非IO
- ARGV の各引数をファイルパスとみなし、それらのファイルを連結した 1つの仮想ファイルを表すオブジェクト。ARGV が空なら
- Kernel#gets、Kernel#readline、Kernel#readlines
- それぞれ
ARGF.gets
、ARGF.readline
、ARGF.readlines
と同じ。モジュール関数
- それぞれ
- STDIN
- 標準入力。読み込みするとユーザー入力を待つ IO オブジェクト。Ctrl-D (EOF シグナル) で打ち切ることができる。
- $stdin
- 初期値が
STDIN
- 初期値が
注意1
-
IO#gets(nil)
- 行区切りなしですべて読み込む
-
IO#read
- 同じくすべて読み込む
-
ARGF.gets(nil)
- 行区切りなしで《1つのファイル》をすべて読み込む
-
ARGF.read
- 《すべてのファイル》を読み込む
ためす
⚠ [Enter]
は Enter 押下の意味で、実際には表示されない
⚠ ^D
は Ctrl-D 押下の意味で、実際には表示されない
$stdin のパターン ($stdin != STDIN
の場合)
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.gets; p $stdin.gets '
"foo\n"
"bar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.gets(nil) '
"foo\nbar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.read '
"foo\nbar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.readlines '
["foo\n", "bar\n"]
STDIN のパターン
-
$stdin == STDIN
の場合は$stdin
を使っても同じ- さらに、
ARGF.filename == "-"
の場合は ARGF を使っても同じ - その場合は Kernel を使っても同じ
- さらに、
$ ruby -e ' p STDIN.gets; p STDIN.gets '
foo[Enter]
"foo\n"
bar[Enter]
"bar\n"
$ ruby -e ' p STDIN.gets(nil) '
foo[Enter]
bar[Enter]
^D"foo\nbar\n"
$ ruby -e ' p STDIN.read '
foo[Enter]
bar[Enter]
^D"foo\nbar\n"
$ ruby -e ' p STDIN.readlines '
foo[Enter]
bar[Enter]
^D["foo\n", "bar\n"]
ARGF のパターン (ARGF.filename != "-"
の場合)
- Kernel を使っても同じ
$ echo foo > foobar.txt
$ echo bar >> foobar.txt
$ echo baz > baz.txt
$ ruby -e ' p ARGF.gets; p ARGF.gets ' -- foobar.txt baz.txt
"foo\n"
"bar\n"
$ ruby -e ' p ARGF.gets(nil) ' -- foobar.txt baz.txt
"foo\nbar\n"
$ ruby -e ' p ARGF.read ' -- foobar.txt baz.txt
"foo\nbar\nbaz\n"
$ ruby -e ' p ARGF.readlines ' -- foobar.txt baz.txt
["foo\n", "bar\n", "baz\n"]
ARGV のパターン
$ ruby -e ' p ARGV.shift; p ARGV.shift ' -- foo bar
"foo"
"bar"
$ ruby -e ' p ARGV ' -- foo bar
["foo", "bar"]
注意2
- Kernel#gets、Kernel#readline、Kernel#readlines はあるが、Kernel#read は存在しない
- 引数がない場合、
ARGF.filename == "-"
になるというだけなので、-
を引数に渡しても STDIN から読み込む (ruby -e ' p ARGF.read ' -- -
) - ARGF はすべてのファイルを読み終わっても、勝手に
ARGF.filename == "-"
になるわけではない
おわり