2009-09-02 8 views
0

J'ai le code Ruby similaire à:Sortie Ecrire à déposer

ok.rb 
hasil = "input operator salah" 
puts hasil 

exec("sort ok.rb > output.txt") if fork.nil? 

Il vient d'écrire tout le code dans output.txt. Cependant, je veux seulement hasil résultat à écrire à output.txt. Comment dois-je modifier le code pour un tel résultat final?

+0

Pouvez-vous expliquer ce que vous essayez de faire? –

Répondre

2

Vous avez exécuté la commande sort en prenant ok.rb comme entrée . Au lieu de cela, vous voulez exécuter ok.rb et prendre sa sortie comme entrée pour trier.

Sans le savoir Ruby, je pense que ce soit quelque chose comme:

exec("ruby ok.rb | sort > output.txt") if fork.nil? 

Je viens d'essayer cela de mon bureau Linux et il a bien fonctionné:

ok.rb:

hasil = "input operator salah" 
puts hasil 

other.rb:

exec("ruby ok.rb | sort > output.txt") if fork.nil? 

Exécuter:

$ ruby other.rb 
$ cat output.txt 
input operator salah 

(Vous avez seulement fourni une seule ligne de sortie, de sorte qu'il n'y avait pas exactement beaucoup à trier.)

1

La manière la plus propre serait de changer le code précédent pour ne pas produire sortie vers stdout directement, mais à la place de ne construire que la chaîne, puis trier ce à partir de ruby ​​et l'imprimer dans le fichier. Comme ceci par exemple:

hasil = "input operator salah" 

File.open("output.txt", "w") do |f| 
    f.puts hasil.split("\n").sort.join("\n") 
end 

En cas de remplacement sorte unix avec tri rubis est pas une option (peut-être parce que type était juste un exemple et, en réalité, vous êtes la tuyauterie à une autre application qui ne peut pas être facilement remplacé par ruby), vous pouvez écrire votre code directement dans l'application au lieu d'écrire sur stdout. Vous pouvez même écrire votre code pour être assez général pour écrire dans n'importe quel E/S.

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