ruby-mine

exploring the mine

ruby -h

von murphy am 04.05.2006 (00 Uhr)

Heute habe ich wieder gesehen, wie nützlich Ruby-Einzeiler sind. Das Kommando ruby akzeptiert die aus Perl bekannten Schalter-e, -n und -p.

Reales Beispiel aus der LaTeX-Welt

Hinweis: Ich hoffe doch mal, jeder kennt LaTeX!

Mein Arbeitgeber (und Prof) hat uns die TeX-Quellen seiner Vorlesung gegeben. Ich wollte herausfinden, wofür er die notes-Umgebung bisher eingesetzt hat. Dafür hätte ich mehrere Dokumente einzeln öffnen und nach solchen Blöcken durchssuchen müssen:

\begin{notes}
Beispiel:
$\phi:=\exists x( Ryz\wedge \forall y(\neg y\eq x\vee  Ryz))$.
\end{notes}

Wir sind doch nicht mehr im Mittelalter! Konsole öffnen, Ruby fragen:

ruby -ne "print if /\\\\begin\\{notes\\}/ .. /\\\\end\\{notes\\}/" *.tex
\begin{notes}[1A]
  Beispiele an der Tafel
\end{notes}
\begin{notes}[1B]
  Beweis an der Tafel
\end{notes}
\begin{notes}[1C]
  Abgeleitete Regeln werden mit zwei Buchstaben bezeichnet

	Beweise an der Tafel
...

Voilà! Sämtliche Daten, die mich interessieren, werden herausgefiltert.

Am Besten man schickt das gleich an einen Editor, damit man in Ruhe lesen kann:

ruby -ne "..." *.tex | gvim -c "set ft=tex" -

Außerdem brauchten wir noch eine Dokumentation zur Makro-Datei, in der allerhand Abkürzungen in der Form

\\nc{\\Bigmid}{\\;\\Big|\\;}

standen. Einen Prototyp erzeugte ich ebenfalls sehr einfach mittels ruby -ne. 5 Minuten später war das Dokument fertig.

Fazit

Gerade wer Ruby als Hochsprache einsetzt und objektorientiert programmiert, der vergisst leicht, dass Ruby auch eine Scriptsprache ist. Ruby kann praktisch alles, was Perl kann, nur einfacher. Und Perl kann alles, was die Shell kann, nur einfacher.

Wer ruby -h mit perl -h vergleicht, könnte Ruby für einen Perl-Klon halten.

Top 10 Interpreterschalter

Hier die zehn (für mich) wichtigsten Optionen:

1. -w
Ist durch Warnungs-Ignorierende Software wie Rails und RedCloth etwas aus der Mode gekommen. Dennoch: Schaltet die Warnungen an und beachtet sie, wenn ihr selbst entwickelt!
2. -e "puts 'Hello, World!'"
Code direkt ausführen.
3. -Ilib
Erweitert den Suchpfad (aka $:) um lib. Sehr nützlich, wenn man Ruby auf Verzeichnisse hinweisen will, die sie sonst nicht durchsuchen würde.
4. -rdatei.rb
Läd die Datei per require. Funktioniert nicht für Gems.
5. -rubygems
Da Gems sich manchmal überaschend verhalten und ich gerne auch mal ohne sie arbeiten möchte (zu Testzwecken, weil Ruby ohne schneller startet, weil $" dann nicht so unübersichtlich ist), habe ich das automatische Laden von RubyGems auf meinem System abgeschaltet. Hiermit aktiviere ich es wieder.
6. -n
Das Script bzw. der -e-Befehl wird mit while gets; ...; end umschlossen. Die globalen Variablen $_ und $. speichern die mit gets gelesene Zeile (mit Zeilenende) und deren Nummer. print, puts, split usw. arbeiten mit $_ als Standardargument. Das erklärt das mystische print if.
7. -d
Setzt $DEBUG auf true. Man kann sehr einfach ein- und ausschaltbaren Debug-Code in sein Programm einbauen, indem man den betreffenden Zeilen if $DEBUG anhängt.
8. -c
Nicht ausführen, sondern nur die Syntax checken. Bei Dateien, die alleine nicht lauffähig sind, ist das nötig (zB funktioniert class Admin::LoginController nicht, wenn das Modul Admin unbekannt ist.)
9. -h
Weil wir alle Hilfe brauchen.
10. -v
Test nach Neuinstallation oder einfach um rauszufinden, dass auf den dummen Sun-Workstations in unserer Uni noch Ruby 1.6.4 läuft.

Ruby the Shell!


Kommentar schreiben

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. WoNáDo schrieb am 03.06.2006 (03 Uhr)

    Mich wundert, dass das hier "ruby -ne "print if /\\begin\{notes\}/ .. /\\end\{notes\}/” *.tex" noch funktioniert (auch mit Ruby 1.8). In der (relativ) neuen PickAxe steht auf Seite 68 (Druckversion), dass seit Version 1.8 die Kurzform "if /regex1/ .. /regex2/" für den ausführlichen Ausdruck "if $_ =~ /regex1/ .. $_ =~ /regex2/" nicht mehr unterstützt wird. Sei soll immer 'true' liefern. Für abgespeicherte Programme kann ich das bestätigen: puts 'Versuch in Kurzform' File.open('rubyt.txt', 'r') do |f| while f.gets print if /2/ .. /4/ end end puts "\nVersuch in Langform" File.open('rubyt.txt', 'r') do |f| while f.gets print if $_ =~ /2/ .. $_ =~ /4/ end end gibt: Versuch in Kurzform 1 2 3 4 5 Versuch in Langform 2 3 4 Kennt jemand dafür eine Begründung?

  2. WoNáDo schrieb am 03.06.2006 (18 Uhr)

    !Sorry, musste zweite Mailadresse angeben, weil das System weder eine Ergänzung meiner ersten Anmerkung, noch eine direkt folgende zweite erlaubt! Hab die Erklärung gefunden. Lag leider an der manchmal unangenehmen Eigenart der PickAxe, dass Informationen über eine Sache im Buch meist stark verteilt sind. Auf Seite 342 ganz unten steht, dass die alte (=vor Ruby 1.8) Form "if /regex1/ .. /regex2/" noch unterstützt wird, sofern die Option "-e" im Kommaqndo angegeben ist. Also als Einzeiler geht das ganz offiziell auch weiterhin.