为了账号安全,请及时绑定邮箱和手机立即绑定

在Ruby中使用STDIN的最佳做法?

/ 猿问

在Ruby中使用STDIN的最佳做法?

幕布斯5086720 2019-10-23 13:06:09

我想处理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


查看完整描述

3 回答

?
元芳怎么了

以下是我在晦涩的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中获得Diamond运算符,但确实获得了它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


查看完整回答
反对 回复 2019-10-23
?
慕斯卡3215842

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


查看完整回答
反对 回复 2019-10-23
?
慕盖茨1488219

我不太确定您需要什么,但是我会使用以下内容:


#!/usr/bin/env ruby


until ARGV.empty? do

  puts "From arguments: #{ARGV.shift}"

end


while a = gets

  puts "From stdin: #{a}"

end

请注意,由于ARGV数组在first之前为空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!


查看完整回答
反对 回复 2019-10-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信