ARGF en français

Qu'est-ce qu'ARGF ?

ARGF est un module de Ruby qui permet de lire des fichiers fournis en tant qu'arguments de ligne de commande ou en entrée standard (STDIN) dans un terminal. Pour mieux comprendre, une script Ruby utilisant ARGF pourrait être considéré comme une version simplifiée de la commande Unix cat.

Voici quelques exemples de son utilisation :

cat fichier1 # Affiche le contenu de fichier1
cat fichier2 # Affiche le contenu de fichier2
echo "entrée standard" | cat # Affiche 'entrée standard'

La commande cat peut accepter un nom de fichier ou utiliser un pipe (|) pour recevoir des données d'une autre commande.

Fonctionnalité d'ARGF

Le module ARGF dispose d'une méthode .read, qui permet de lire intégralement le contenu des fichiers fournis en tant qu'arguments en ligne de commande.

Voici comment vous l'utilisez :

# argf.rb
puts ARGF.read

Vous pourrez l'exécuter avec les commandes suivantes :

ruby argf.rb fichier1 fichier2 # Affiche le contenu de fichier1 et fichier2

Si aucun fichier n’est spécifié, ARGF peut également lire l’entrée standard :

echo "STDIN" | ruby argf.rb # Affiche 'STDIN'

L’utilisation d'une combinaison de fichiers et d'entrée standard fonctionne aussi :

echo "STDIN" | ruby argf.rb fichier1 fichier2 - # Affiche le contenu de fichier1, fichier2 et 'STDIN'

Les arguments avec ARGV

En coulisses, Ruby utilise un tableau appelé ARGV qui contient les noms de tous les arguments passés au script par la ligne de commande ou via STDIN.

# argf_inspect_argv.rb
puts ARGV.inspect

Ce tableau ignore si les arguments sont des noms de fichiers valides ou non :

ruby argf_inspect_argv.rb fichier1 fichier2 # Sortie : ["fichier1", "fichier2"]
ruby argf_inspect_argv.rb un deux # Sortie : ["un", "deux"]

Il est courant d'utiliser des indicateurs dans les commandes du terminal, tels que --verbose ou --all.

ruby argf_inspect_argv.rb --all un deux # Sortie : ["--all", "un", "deux"]

Le tableau ARGV stocke les noms des fichiers ainsi que d'autres arguments passés en ligne de commande. La méthode .shift permet de retirer tout argument d'ARGV qui n'est pas un fichier :

# argv_shift.rb
ARGV.shift
puts ARGV.inspect
ruby argv_shift.rb --all un deux # Sortie : ["un", "deux"]

Notez que les fichiers traités par ARGF.read sont retirés du tableau ARGV.

Détails sur .readlines

.readlines génère un tableau de chaînes de caractères, chaque élément représentant le contenu des fichiers transmis au script Ruby. Cela permet souvent de séparer les lignes d'un fichier pour pouvoir itérer avec d'autres méthodes comme .each.

# argv_readlines.rb
lignes = ARGF.readlines
puts lignes
puts lignes.inspect

Exécution avec les fichiers respectifs :

ruby argv_readlines.rb fichier1 fichier2 # Affiche le contenu de fichier1 et fichier2

Le résultat serait :

# Contenu de fichier1
# Contenu de fichier2
# ["Contenu de fichier1\n", "Contenu de fichier2\n"]

Attention, .readlines ne pourra pas traiter des arguments de ligne de commande qui ne sont pas des noms de fichiers valides :

ruby argv_readlines.rb un deux #=> argv_readlines.rb : erreur : Aucun fichier ou répertoire de ce type - un (Errno::ENOENT)