Ruby でコマンドライン入力を扱いたい:
> cat input.txt | myprog.rb
> myprog.rb < input.txt
> myprog.rb arg1 arg2 arg3 ...
最善の方法は何でしょうか? 特に、空の STDIN を処理したいので、エレガントな解決策を期待しています。
#!/usr/bin/env ruby
STDIN.read.split("\n").each do |a|
puts a
end
ARGV.each do |b|
puts b
end
ベストアンサー1
以下は、私があまり知られていない Ruby のコレクションで見つけたものの一部です。
したがって、Ruby では、Unix コマンドの単純なベルなしの実装は次
cat
のようになります。#!/usr/bin/env ruby puts ARGF.read
ARGF
は入力に関して頼りになる存在です。名前付きファイルからすべての入力を取得するか、STDIN からすべての入力を取得する仮想ファイルです。
ARGF.each_with_index do |line, idx|
print ARGF.filename, ":", idx, ";", line
end
# print all the lines in every file passed via command line that contains login
ARGF.each do |line|
puts line if line =~ /login/
end
ありがたいことに、Ruby にはダイヤモンド演算子はありませんが、
ARGF
代わりにダイヤモンド演算子があります。あまり知られていませんが、実際には便利です。次のプログラムを考えてみましょう。このプログラムは、コマンドラインで指定されたすべてのファイルの先頭に著作権ヘッダーをその場で追加します (別の Perlism のおかげです-i
)。#!/usr/bin/env ruby -i Header = DATA.read ARGF.each_line do |e| puts Header if ARGF.pos - e.length == 0 puts e end __END__ #-- # Copyright (C) 2007 Fancypants, Inc. #++
—http://blog.nicksieger.com/articles/2007/10/06/obscure-and-ugly-perlisms-in-ruby
クレジット: