Die Programmiersprache Ruby

Blog| Forum| Wiki  

Die beiden vordefinierten Konstanten ARGV und ARGF behandeln die Konsolen-Argumente, die einem Ruby-Programm mitgegeben werden.

Inhaltsverzeichnis

ARGV

Das Array ARGV enthält alle Konsolen-Argumente, die dem Ruby-Programm mitgegeben wurden. Die Optionen für den Ruby-Interpreter und der Name des Ruby-Programms sind bereits entfernt.

Beispiel

Der Dateiname ist "Schreibe_hello.rb".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#Definiere die Methode "hello", die die Datei schreibt
def hello(text, file)
  File.open(file, "w") {|f| f.write(text)}
end
#Normalerweise wird in die Datei "Text.txt" der Test "Hello World!" geschrieben
text, file = "Hello World!", "Test.txt"
#Iteriere über das Array, das die Konsolennargumente enthält
ARGV.each_with_index do |arg, index|
  #Prüfe, ob eine Option angegeben wurde, und wenn ja, nehme Änderungen vor
  if arg == "-t"
    text = ARGV[index + 1]
  elsif arg == "-f"
    file = ARGV[index + 1]
  end
end
#Schreibe den Text in die Datei
hello(text, file)

Das Programm kann man auf eine dieser Varianten aufrufen:

$ ruby Schreibe_hello.rb
$ ruby Schreibe_hello.rb -t "HE!"
$ ruby Schreibe_hello.rb -f "AndereDatei.txt"
$ ruby Schreibe_hello.rb -t "HE!" -f "AndereDatei.txt"
$ ruby Schreibe_hello.rb -f "AndereDatei.txt" -t "HE!"

Entsprechend den Angaben wird dann in die unter -f angegebene Datei der unter -t angegebene Text geschrieben.

ARGF

Mit ARGF verhält es sich anders als mit ARGV. Anders als ARGV ist ARGF kein Array, obwohl man das vielleicht vermuten würde. Es enthält die Inhalte aller der auf der Konsole mitgegebenen Dateien - einfach hintereinandergepappt (um festzustellen, aus welcher Datei ARGF gerade liest, kann man die vordefinierte globale Variable $FILENAME verwenden). Kann es eine Datei nicht finden (beispielsweise, weil auf der Konsole -a "Test.txt" eingegeben wurde und er "-a" nicht finden kann) wirft Ruby einen Error. Aus diesem Grund lässt es sich auch nur schwer zusammen mit ARGV nutzen. ARGF ist ein Fileartiges Objekt (auch wenn ein ARGF.class interessanterweise Object ausgibt) und besitzt entsprechende Methoden. Beispiel:

1
2
3
4
5
6
#Erste Zeile der ersten Datei ausgeben
puts ARGF.gets
#Alle Dateien hintereinander ausgeben (Vorsicht! Erste Zeile schon abgezogen!)
ARGF.each do |zeile|
  puts zeile
end

Aufrufen könnte man es so:

$ ruby argf.rb "Test.txt" "Test2.txt"

Die Ausgabe variiert natürlich, je nachdem, welche Inhalte die Dateien enthalten. Angenommen, die Dateien sähen so aus:
Test.txt

Hallo Welt!
Ich hab doch schon Hallo gesagt!

Test2.txt

Wiedersehen, Welt!
Hau ab!

Dann sähe die Ausgabe mit Aufruf so aus:

$ ruby argf.rb "Test.txt" "Test2.txt"
Hallo Welt!
Ich hab doch schon Hallo gesagt!
Wiedersehen, Welt!
Hau ab!

Siehe auch