前置き
Rubyを使ってプログラミングコンテストのような形で問題を解くことがあったのだが、その際に焦ってしまって複数行入力のやり方を間違って実装してしまった。
このような悲しい初心者の方を一人でも減らすべく、今回記事を作成した。
コードだけ早く見せてくれという人へ
ただいま問題解いている最中で「説明などいいからコードを見せて欲しい!!」という人もいると思うので最初にコードを載せておく。
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文で代入と判定を同時に行っています。
調べた方は標準入力に$stdin
とSTDIN
があることに気がついていると思いますが、グローバル変数と組み込み変数という差こそあれど実質違いが無いという認識です。
またレシーバを指定しないgets
等のメソッドはデフォルトで$stdin
を参照するので、
while line = gets
でも同じ結果になります。
chomp
は改行文字を消し、split
は引数を用意しなければ空白を発見したら要素に切り分けます。
これを最初に用意した配列に追加していくことで[[ruby, python, perl], [haskell, scala, ocaml]]
のように行ごとに分けられた引数をまとめた配列をゲットできます。
あとは必要であればflatten
みたいなメソッドを使えば、標準入力から引数を受け取る際に問題になることはあまりないでしょう。