Die Programmiersprache Ruby

Blog| Forum| Wiki  

Inhaltsverzeichnis

Werte vertauschen

Dies geht ohne temporäre Variable.

a, b = b, a


Assert

Testet den Block und wirft bei false eine Exception im Debugmodus.

1
2
3
4
5
def assert
  raise "Assertion failed" unless yield if $DEBUG
end

assert { self.is_a? Object }


Für eine etwas umfangreichere Implementierung, die einen IRB-Prompt im passenden Kontext erzeugt, und weniger Overhead hat, wenn der Debugmodus deaktiviert ist, siehe auch http://ruby-breakpoint.rubyforge.org/doc/classes/Breakpoint.html#M000005.

Zeilen zusammenfassen

  • -00 bestimmt ein Record Seperator der Länge Null, heißt gets liest absatzweise aus der Datei
  • -n while(gets); ... ; end wrapt sich um das Skript
  • -e bestimmt direkt einen String als Ruby-Skript

Mehrere Zeilen in einem Absatz werden zu einer Zeile zusammengefasst.

ruby -00 -ne 'puts $_.split("\n").join(" ")' Dateiname


Zeilen suchen aka Ruby Grep

Druckt nur die Zeilen die den Regulären Ausdruck matchen.

ruby -00 -ne 'print if /Suchausdruck/' Dateiname


Zufalls Array

Verteilt die Elemente eines Arrays neu nach Zufallsprinzip.

1
2
3
4
5
class Array
  def shuffle
    self.sort_by { rand }
  end
end


Zufalls Zeile

Hier kommen gleich ein paar Ruby-Tricks zum Einsatz.

  • -ne sorgt für ein while(gets) Loop
  • rand gibt eine Zufallszahl zwischen 0 und 1 zurück
  • $. ist die aktuelle Zeilennummer. Startet bei 1.
  • Der END-Block wird am Ende des Skripts ausgeführt.
ruby -ne 'line = $_ if rand < 1 / $. .to_f ; END { puts line }' </usr/share/dict/words


Zeilen zählen

Ein banales aber irgendwie nettes Skript.

ruby -ne 'END {puts $.}' Dateiname


Prüfsumme erstellen aka Ruby md5sum

Gibt die md5-Prüfsumme einer Datei aus:

ruby -r md5 -e "puts MD5.new(open(ARGV[0], 'rb').read).hexdigest" Dateiname


größter gemeinsamer Teiler

gefunden in ruby-talk: Rudolph Polzer

Sieht auch sehr schön aus, find ich. Ermittelt den ggT(a,b), wobei das Ergebnis in a gespeichert wird.

a, b = b, a % b while b != 0


Text in vielen Dateien ersetzen

Sehr nützlich.

  • -i verändert die Dateien direkt, optional kann man eine Erweiterung für Backups angeben, z.B. bak
  • -pe führt in der while(gets) Schleife aus und schreibt $_ am Ende auf Standardoutput (wie z.B. sed).
  • Kernel#gsub! operiert auf $_ , das durch gets gesetzt wurde
ruby -i -pe "gsub!(/ein regul��rer Ausdruck/, 'zum Ersetzen')" Datei1 Datei2 ...


Einbruchssicherung

Sucht nach root accounts in der Passwort-Datei. Nützlich, da rootkits die Systemtools wie cat ersetzen. Hier wiederum operiert /:0:/ auf $_

ruby -ne 'p if /:0:/' /etc/passwd


Uhrzeit bitte...

ruby -e "loop { puts Time.now; sleep 1 }"


oder...

ruby -e "loop {print Time.now; STDOUT.flush; sleep 1; print 8.chr*80}"


oder...

ruby -e 'loop { print "\r#{Time.now}"; STDOUT.flush; sleep 1 }'


Query-String in Hash konvertieren

1
2
3
query_string = 'arg1=val1&arg2=%2fval2%2f'
args = Hash[*query_string.scan(/(.+?)=(.*?)(?:&|$)/).flatten].each_value { |v| v.gsub!(/%([0-9a-f]{2})/i) { [$1.hex].pack 'C' } }
p args  #-> {"arg1"=>"val1", "arg2"=>"/val2/"}


Derzeit geöffnete Dateien

Um Dateien löschen zu können, dürfen diese nicht mehr geöffnet sein. Manchmal ist es hilfreich, dazu alle derzeit geöffneten Dateien anzeigen zu lassen.

ObjectSpace.each_object( File  ){|obj| p obj unless obj.closed?}


Primzahlberechner

Berechnet alle Primzahlen von 1 bis Unendlich ;-)

Von hier.

i=l=1;(l%i+=1)>i-2&&p(i)while l*=i


Array-Elemente vereinen

Vereint je zwei Elemente in einem Array. Das Original-Array selbst wird dabei modifiziert.

1
2
a = ["q", "w", "e", "r", "t", "z" ]
a.each_index{ |i| a[i, 2] = a[i] + a[i+1] }


Resultat:

a = ["qw", "er", "tz"]