Ruby の STDIN のベストプラクティスは? [closed] 質問する

Ruby の STDIN のベストプラクティスは? [closed] 質問する

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

https://web.archive.org/web/20080725055721/http://www.oreillynet.com/ruby/blog/2007/04/trivial_scripting_with_ruby.html#comment-565558

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

クレジット:

おすすめ記事