当前位置:  开发笔记 > 编程语言 > 正文

Ruby中STDIN的最佳实践?

如何解决《Ruby中STDIN的最佳实践?》经验,为你挑选了5个好方法。



1> Jonke..:

以下是我在晦涩的Ruby系列中发现的一些东西.

因此,在Ruby中,Unix命令的一个简单的no-bells实现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了替代品.虽然模糊不清,但它实际上证明是有用的.考虑一下这个程序,该程序-i在命令行中提到的每个文件上就地存在版权标题(感谢另一个Perlism ):

#!/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://www.oreillynet.com/ruby/blog/2007/04/trivial_scripting_with_ruby.html#comment-565558

http://blog.nicksieger.com/articles/2007/10/06/obscure-and-ugly-perlisms-in-ruby


ARGF是要走的路.这是Ruby内置的以全方位处理文件和标准输入的方式.

2> 小智..:

Ruby提供了另一种处理STDIN的方法:-n标志.它将整个程序视为在STDIN上的循环中(包括作为命令行args传递的文件).请参阅以下1行脚本:

#!/usr/bin/env ruby -n

#example.rb

puts "hello: #{$_}" #prepend 'hello:' to each line from STDIN

#these will all work:
# ./example.rb < input.txt
# cat input.txt | ./example.rb
# ./example.rb input.txt


三部分shebang`#!/ usr/bin/env ruby​​ -n`将无效,因为"ruby -n"将作为唯一参数传递给/ usr/bin/env.[查看此答案](http://stackoverflow.com/a/4304187)了解更多详情.如果明确地使用`ruby -n script.rb`运行,脚本**将会起作用.
@jdizzle:它适用于OSX,但不适用于Linux - 而这正是问题所在:它不是_portable_.
包括'-n'在内的shebaing适用于我的Mac OS X 10.8盒子.

3> Damir Zekić..:

我不太确定你需要什么,但我会用这样的东西:

#!/usr/bin/env ruby

until ARGV.empty? do
  puts "From arguments: #{ARGV.shift}"
end

while a = gets
  puts "From stdin: #{a}"
end

请注意,因为ARGV数组在第一次之前是空的gets,所以Ruby不会尝试将参数解释为从中读取的文本文件(从Perl继承的行为).

如果stdin为空或没有参数,则不打印任何内容.

几个测试用例:

$ cat input.txt | ./myprog.rb
From stdin: line 1
From stdin: line 2

$ ./myprog.rb arg1 arg2 arg3
From arguments: arg1
From arguments: arg2
From arguments: arg3
hi!
From stdin: hi!



4> Magnus Holm..:

也许这样的事情?

#/usr/bin/env ruby

if $stdin.tty?
  ARGV.each do |file|
    puts "do something with this file: #{file}"
  end
else
  $stdin.each_line do |line|
    puts "do something with this line: #{line}"
  end
end

例:

> cat input.txt | ./myprog.rb
do something with this line: this
do something with this line: is
do something with this line: a
do something with this line: test
> ./myprog.rb < input.txt 
do something with this line: this
do something with this line: is
do something with this line: a
do something with this line: test
> ./myprog.rb arg1 arg2 arg3
do something with this file: arg1
do something with this file: arg2
do something with this file: arg3



5> texasbruce..:
while STDIN.gets
  puts $_
end

while ARGF.gets
  puts $_
end

这是受Perl的启发:

while(){
  print "$_\n"
}


地狱啊,因为简单和可读性!哦不,等等,那是什么'$ _'?请在Stack Overflow上使用[English](http://www.ruby-doc.org/stdlib-2.0/libdoc/English/rdoc/English.html)!
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有