LoginSignup
19
16

More than 5 years have passed since last update.

Rubyで複数行の標準入力を使いたい人へ

Last updated at Posted at 2017-06-16

前置き

Rubyを使ってプログラミングコンテストのような形で問題を解くことがあったのだが、その際に焦ってしまって複数行入力のやり方を間違って実装してしまった。
このような悲しい初心者の方を一人でも減らすべく、今回記事を作成した。

コードだけ早く見せてくれという人へ

ただいま問題解いている最中で「説明などいいからコードを見せて欲しい!!」という人もいると思うので最初にコードを載せておく。

io.rb
attrs = Array.new
while line = $stdin.gets
  attrs << line.chomp.split
end

# ここからは結果をお見せするために書いてるよ
puts attrs
puts attrs.length
puts attrs[0][-1]

これを使用すると結果はこうなる

ruby io.rb #呼び出し
ruby python perl
haskell scala ocaml #この2行は引数 ctrl+dを押すと実行されるよ
ruby
python
perl
haskell
scala
ocaml
2
perl

仕組みを説明

最初に空の配列を用意して引数を入れいく箱を用意します。
そして、その次のwhile文で代入と判定を同時に行っています。

調べた方は標準入力に$stdinSTDINがあることに気がついていると思いますが、グローバル変数と組み込み変数という差こそあれど実質違いが無いという認識です。

またレシーバを指定しないgets等のメソッドはデフォルトで$stdinを参照するので、

while line = gets

でも同じ結果になります。

chompは改行文字を消し、splitは引数を用意しなければ空白を発見したら要素に切り分けます。
これを最初に用意した配列に追加していくことで[[ruby, python, perl], [haskell, scala, ocaml]]のように行ごとに分けられた引数をまとめた配列をゲットできます。

あとは必要であればflattenみたいなメソッドを使えば、標準入力から引数を受け取る際に問題になることはあまりないでしょう。

19
16
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
16