【问题标题】:How do I store standard outputs to multiple variables?如何将标准输出存储到多个变量?
【发布时间】:2016-11-30 18:36:50
【问题描述】:

如何将 Ruby 标准输出存储到多个变量?

例如,如果我有:

puts "hello"

puts "thanks"

如何将“hello”和“thanks”存储到两个不同的变量中,例如strVar(包含值“hello”)和strVar2(包含值“thanks”)。

在我的脚本中,我正在调用另一个 Ruby 脚本,它将puts 多个字符串输出到标准输出。如何单独存储标准输出中的每个字符串?

【问题讨论】:

  • 您正在尝试在变量中捕获您自己脚本的标准输出?
  • @muistooshort 之类的。在我的脚本中,我正在调用另一个 ruby​​ 脚本,它将多个字符串放入标准输出。如何单独存储标准输出中的每个字符串?谢谢。
  • 虽然我不推荐它,StringIO 是要走的路。看看this answer

标签: ruby-on-rails ruby variables stdout


【解决方案1】:

我不确定我是否理解这个问题,但存储/打印字符串的方法有无数种。很难想象在puts 后面有一个不是手动输入或以编程方式设置的值的情况。

您可以使用gets 或$stdin.gets 或ARGV 数组作为参数保存输入变量。例如:

puts "Enter the first string"
var0 = $stdin.gets.chomp

如果您已经保存了值

var1 = "hello"
var2 = "thanks"
array = [var1, var2]
hash = {:key1 => var1, :key2 => var2}


puts var1
puts var2
array.each do |str| puts str end
hash.map do |k, v| puts v end

【讨论】:

  • 谢谢。但是,如果我没有保存值怎么办?例如,就我而言,我在脚本中调用了另一个脚本,因此我无法控制。其他脚本有很多行,其中字符串被放置到出色的输出中。
  • 也许你可以使用管道?例如,ruby script1.rb | ruby script2.rb 并使用 $stdin.gets 来获取输出?我认为没有办法在 script2 中同时执行另一个 ruby​​ 脚本并监控 $stdin。如果 script1 有异常应该怎么办?正确的方法是使用数据库/redis/filestore 并将值存储在那里:)
  • 我认为这部分与我目前发现的一致。谢谢。 :)
  • 如果您想要更多控制权,请使用Open3 库和popen3 之类的方法,它为您提供输入、输出、错误的句柄以及等待该过程完成的方法。
【解决方案2】:

您基本上是将应用程序/脚本链接在一起。有多种方法可以做到这一点,但最简单的方法是使用 STDIN/STDOUT 管道。

一个简单的例子是使用两个小脚本。将此另存为 test.rb:

puts 'foo'
puts 'bar'

这是 test2.rb:

v1 = gets.chomp
v2 = gets.chomp

puts "v1=#{v1} v2=#{v2}"

然后,在命令行使用:

ruby test.rb | ruby test2.rb

将输出:

v1=foo v2=bar

| 是我们将一个脚本的输出链接到另一个脚本的输入的方式,它不是 Ruby 的一部分,而是操作系统的一部分。

这是可行的,因为默认情况下,puts 写入 STDOUT,gets 从 STDIN 读取。 | 将它们连接在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多