我有类似的Ruby代码:
ok.rb
hasil = "input operator salah"
puts hasil
exec("sort ok.rb > output.txt") if fork.nil?
它只是将所有代码写入output.txt
。但是,我只希望将hasil
结果写入output.txt
。我应该如何修改这样的最终结果的代码?
答案 0 :(得分:2)
您已执行sort
命令,将ok.rb
作为输入。相反,您希望运行ok.rb
并将其输出作为输入进行排序。
在不了解Ruby的情况下,我希望它会像:
exec("ruby ok.rb | sort > output.txt") if fork.nil?
我刚刚在我的Linux桌面上试过这个,它运行良好:
ok.rb:
hasil = "input operator salah"
puts hasil
other.rb:
exec("ruby ok.rb | sort > output.txt") if fork.nil?
执行:
$ ruby other.rb
$ cat output.txt
input operator salah
(你只提供了一行输出,所以不需要排序很多。)
答案 1 :(得分:1)
最干净的方法是将前面的代码更改为不直接生成到stdout的输出,而是仅构建字符串,然后从ruby中对其进行排序并将其打印到文件中。像这样举例如:
hasil = "input operator salah"
File.open("output.txt", "w") do |f|
f.puts hasil.split("\n").sort.join("\n")
end
如果用ruby sort替换unix排序不是一个选项(可能因为排序只是一个例子而且实际上你正在使用不能用ruby替换的不同应用程序),你可以编写你的代码到应用程序直接而不是写入stdout。你甚至可以编写你的代码,以便写入任何IO。
def generate_output(out)
hasil = "input operator salah"
out.puts hasil
end
# If you decide to output the text directly to stdout (without sorting)
generate_output(stdout)
# If you instead want to pipe to sort:
IO.popen("sort > output.txt", "w") do |sort|
generate_output(sort)
end