WOKs Perl-Tipps

Hier also nun alles mögliche um die Skriptsprache »Perl«.
Perl wurde 1986 von Larry Wall erfunden und eignet sich hervorragend, um alle Arten von Text durch den »Fleischwolf« zu drehen. Texte (aber auch binäre Dateien) können sehr leicht aus Dateien ausgelesen und auch wieder gespeichert werden. Sind Texte einmal eingelesen, kann man die mit regulären Ausdrücken absuchen und manipulieren.
Hier gehts zum Wikipedia-Eintrag zu Perl.

Hier einige Highlights dieser Sprache

Perl-Links & kostenlose Perl-Tools mit dem "WOK-Gütesiegel"TM

WOKs Perl-Tips (nicht nur) für Expäddn

Alle ausklappen Alle Antworten ausklappen oder Alle einklappen alle Antworten einklappen

Aus/Einklappen Unter welchem Betriebssystem läuft mein Script eigentlich? (Wichtig z.B. zur Konstruktion korrekter Dateinamen)
$^O == [linux|MsWin32|...] (Hinter dem ^ ist ein großer Buchstabe 'Oohh')
Aus/Einklappen Wie kann ich verhindern, dass Ausgaben auf STDOUT nur gepuffert ausgegeben werden?
Entweder: $|=1;
oder: use FileHandle; STDOUT->autoflush(1);
Aus/Einklappen Alles im grünen Bereich? Gab es einen Fehler? Wie kann ich den Errorlevel abfragen?
$! enthält den aktuellen Errorlevel
Aus/Einklappen Wieviele Sekunden läuft mein Perl-Skript schon? Wie kann ich x Sekunden warten? Wie Bruchteile von Sekunden warten? Und wie kann ich hochauflösende Zeitmessungen durchführen?
$^T enthält die Startzeit des Skriptes und so kann man mit:
(time - $^T) die Laufzeit in Sekunden ermitteln
sleep(int seconds) wartet eine Anzahl ganzer Sekunden
select(undef, undef, undef, 0.3333) wartet eine Drittel Sekunde
Mit dem Perl-Modul Time::Hires kann hochauflösende Zeitmessung gemacht werden.
Aus/Einklappen Wie heißt das Skript, das gerade läuft?
$0 (hinter dem $ steht die Ziffer Null)
Aus/Einklappen Wie kann ich Dateien umbenennen, kopieren oder löschen?
rename ($alt, $neu) benennt eine Datei um
use File::Copy; copy($alt, $neu) kopiert eine Datei
unlink($alt) löscht eine Datei

Anschließend den Errorlevel mit der Variable $! abfragen!
Aus/Einklappen Wie kann ich rekursiv einen Verzeichnis-Baum nach Dateien mit einem bestimmten Namensmuster durchsuchen?
use File::Find;
find(\&myFileFilter, $myRoot); # ab Verzeichnis $myRoot suchen

sub myFileFilter
{
  $_ enthält kompletten Pfad (Verzeichnis und Dateinamen)
  $File::Find::dir enthält aktuelles Verzeichnis
  $File::Find::name enthält aktuellen Dateinamen
}
Aus/Einklappen Wie kann ich das aktuelle Verzeichnis abfragen, wechseln oder ein neues Directory anlegen?
Abfragen: use Cwd; $currentPath = cwd();
Wechseln: chdir ($newdir);
Anlegen: mkdir ($newdir, 0755);

Anschließend den Errorlevel mit der Variable $! abfragen!
Aus/Einklappen Wie kann ich ein Datei- oder Directory-Handle nur lokal für eine Subroutine nutzbar machen?
Mit local($var) wird eine Variable innerhalb einer sub-Routine lokal bekannt gemacht.
Mit local(*DIR) oder local(*FILE) geschieht selbiges mit einem Verzeichnis/Datei-Handle.
Aus/Einklappen Wie kann ich einen Hash sortieren - nach Werten (values) oder nach Schlüsseln (keys), nummerisch oder alphabetisch
Die Perl-Funktion sort sortiert normalerweise ein übergebenes Array mit dem String-Comparator cmp.
nach keys, nummerisch: foreach $key (sort {$a <=> $b} keys %hash) {print $key > $hash{$key}};
nach keys, alphabetisch: foreach $key (sort keys %hash) {print $key > $hash{$key}};
nach keys absteigend, nummerisch: foreach $key (sort {$b <=> $a} keys %hash) {print $key > $hash{$key}};
nach values, nummerisch: foreach $key (sort {$hash{$a} <=> $hash{$b}} keys %hash) {print $key > $hash{$key}};
nach values, alphabetisch: foreach $key (sort {$hash{$a} cmp $hash{$b}} keys %hash) {print $key > $hash{$key}};
Aus/Einklappen Wie kann ich Zeichenketten mit deutschen Umlauten (Sonderzeichen ö,ä,ü,Ö,Ä,Ü,ß) mit der Perl-Funktion sort und den Vergleichsoperatoren lt, gt, cmp korrekt sortieren? Auch lc() uc() sollen korrekt arbeiten?
use locale;
use POSIX qw(locale_h);
setlocale(LC_ALL, "german");
Aus/Einklappen Welchen Index hat der letzte Eintrag in einem Array @myArray?
$#MyArray (ist 0-basiert, also Anzahl Elemente = $#MyArray+1)
Aus/Einklappen Was ist der Unterschied zwischen system() und exec()?
Beide führen externe Programme aus.
system("ls -la > files.txt"); # das Perl-Skript wartet, bis das externe Prog. fertig ist
exec("ls -la > files.txt"); # das Perl-Skript macht sofort nach dem Start weiter (wartet nicht).
Aus/Einklappen Wie bekomme ich alle Fundstellen eines Musters in ein Array? Wie kann ich die Fundstellen zählen?
@allMatches = ($allText =~ /pattern/g);
$countMatches = ($allText =~ /pattern/g);
Aus/Einklappen Wenn ein pattern-Match passt: Was steht davor / dahinter / im Match?
Nach erfolgreichem Pattern-Matching:
if ($text = /Mein Suchwort/)
{
  $davor = $`;
  $treffer = $&;
  $dahinter = $';
}

Es gilt also: ($text eq $`.$&.$')
Aus/Einklappen Wie arbeite ich mit Referenzen (ähnlich Pointern) z.B. auf ganze Hash-Tabellen?
Referenz erzeugen: $hashref = \%hash;
Ganzes Hash über Referenz ansprechen z.B.: @keys = keys (%$hashref);
Einen Hashwert über Referenz ansprechen z.B.: $myValue = $$hashref{$myKey};
Aus/Einklappen Was genau macht eigentlich der Modulo-Operator (%) - Kann das Ergebnis von (x%y) auch negativ sein?
In Perl: "NEIN, ES KANN NICHT NEGATIV SEIN!"
Perl verhält sich hier anders als andere Programmier-Sprachen (siehe unten), man kann aber das "übliche" Verhalten mit der Anweisung use integer; erzwingen.

Der %-Operator ermittelt den Rest einer ganzzahligen Division. Also (7 % 3 == 1). Soweit klar. Was passiert aber, wenn einer der Operanden negativ wird? Ist dann das Ergebnis des %-Operators auch negativ?
Dafür gibt es zwei "Sichtweisen". Und diese stützen sich auf eine unterschiedliche Interpretation der ganzzahligen Division DIV ab.
Laut Donald Knuth ("The Art of Computer Programming") gilt: x DIV y = floor (x/y) mit floor(z) ist größte ganze Zahl <= z. Also z.B. floor (-4/3) = floor(-1.333) = -2
Laut Nicolaus Wirth ("Pascal Programmiersprache") gilt: x DIV y = trunc (x/y) mit trunc(z) ist z ohne Nachkommastellen. Also z.B. trunc(-4/3) = trunc (-1.333) = -1
Sind x und y positiv, so liefern die beiden dasselbe Ergebnis!

Da aber nach beiden Schulen (Knuth und Wirth) der Rest der ganzzahligen Division definiert wird durch:
x MOD y = x - ((x DIV y) * y) gilt:
nach Knuth: -4 MOD 3 = -4 - (-2 * 3) = -4 - (-6) = -4 + 6 = +2
nach Wirth: -4 MOD 3 = -4 - (-1 * 3) = -4 - (-3) = -4 + 3 = -1

Vorteil Knuth: Solange y>0 ist auch immer (x MOD y) > 0. Das ist eine wichtige Eigenschaft
Vorteil With: Die ganzzahlige Division ist hier symmetrisch: (-x) div y = x div (-y) = -(x div y) (nicht bei Knuth! Da gilt: (-x) div y = x div (-y) <> -(x div y)!).

Programmiersprachen mit Knuth-Modulo-Operator (-4%3==+2): z.B. perl
Programmiersprachen mit Wirth-Modulo-Operator (-4%3==-1): z.B. Pascal, Java, C#, C, C++

Valid HTML 4.01! Valid CSS!

[Zurück]