[Ruby] Reconnaître les caractères de contrôle ASCII tels que ^ H comme prévu lors de l'acceptation d'une entrée standard

Conclusion

** Utilisez Readline.readline au lieu de STDIN.gets **

STDIN.gets Si vous regardez comment recevoir une entrée standard dans Ruby, vous trouverez souvent les implémentations suivantes:

stdin.rb


print '> '
text = STDIN.gets.strip
puts "You said #{text}!"
$ ruby stdin.rb
> hello
You said hello!

Il semble qu'il y ait «read», «readline» et «readlines» en plus de «gets». Je veux lire plusieurs lignes à partir de l'entrée standard Ruby

Désavantage

Cependant, avec la méthode ci-dessus, les caractères de contrôle ASCII ne peuvent pas être reconnus avec le comportement prévu.

$ ruby stdin.rb
> hello^H^H^H
You said he!lo

Dans l'exemple ci-dessus, après avoir tapé «bonjour», le retour arrière du caractère de contrôle ASCII (qui peut être entré avec «ctrl» + «H») est entré trois fois.

En fait, après avoir entré bonjour, j'ai entré le caractère de contrôle de retour arrière trois fois, donc je veux que ce soit he, mais il devient bonjour ^ H ^ H ^ H et accepte l'entrée standard. L'espace arrière est appliqué une fois que vous avez terminé.

Solution

Pour ce faire comme prévu, implémentez-le comme suit:

readline.rb


require 'readline'

print '> '
text = Readline.readline
puts "You said #{text}!"
$ ruby readline.rb
> he # "hello"Après avoir tapé ctrl+Pressé H 3 fois
You said he!

Autre

Readline.readline est utile car vous pouvez utiliser un autre historique. Vous pouvez afficher la chaîne précédemment entrée en appuyant sur la touche haut du curseur ou en appuyant sur «ctrl» + «P». Pour plus de détails, reportez-vous au module Readline Reference Manual.

Voir Wikipedia pour les caractères de contrôle ASCII.

Recommended Posts

[Ruby] Reconnaître les caractères de contrôle ASCII tels que ^ H comme prévu lors de l'acceptation d'une entrée standard
Entrée standard Ruby