Tuning in zehn Kurz, Nützliche Perl Programme

Einige Leute glauben, dass kurze Programme für nicht gut sind sehr viel, aber das ist nicht so mit Perl. Nur ein paar Zeilen Perl-Code kann ein langer Weg zu gehen. Dieser Artikel listet einige praktische winzig kleinen Perl-Programme.

Sammeln einzigartige Linien

Wenn Ihre Textdatei viele Zeilen hat, die Duplikate sind und Sie wollen nur die einzigartigen Linien zu sehen, können Sie sie in ein Array zu sammeln mit dem folgenden Programm (in diesem Fall ist es @Unique genannt):

offen (IN, "somefile.txt") - @Unique = () -
während() {Es sei denn, ($ i {$ _} ++) {push (@Unique, $ _)}}

Der Trick dabei ist, dass $ i {$ _} ++ 0 gibt das erste Mal, wenn Sie mit $ _ als Schlüssel einen Schlüssel-Wert-Paar erstellen, und einige Nicht-Null-Wert danach.

Erste von mehreren Leerzeilen befreien

Einige Textdateien haben mehrere, aufeinander folgende Leerzeilen, die sie schwer zu lesen machen, vor allem auf kleinen Bildschirmen. Das folgende Programm druckt eine Textdatei, die alle Instanzen von zwei oder mehreren Leerzeilen in eine einzige Leerzeile zu komprimieren.

Hinweis: Eine Leerzeile kann in ihm Leerzeichen, wie Leerzeichen und Tabulatoren, aber keine darstellbaren Zeichen.

offen (IN, "somefile.txt") - $ PrevBlank = 0-
während() {
if (/ S / oder! $ PrevBlank) {print $ _}
$ PrevBlank = / ^ s * $ / -
}

Die if-Anweisung in dem vorhergehenden Beispiel ist der Fall, wenn es nicht leere Zeichen in der Zeile oder wenn die vorherige Zeile nicht leer war. Die $ PrevBlank Zuordnung erfahren Sie, ob die aktuelle Zeile leer ist, was bedeutet, dass es keine oder mehrere Leerzeichen und sonst nichts.

Druckzeilen aus einer Datei in sortierter Reihenfolge

Es ist leicht zu vergessen, wie nützlich die Perl-Sortierfunktion ist. Das folgende Programm liest die gesamte Datei in ein Array, sortiert das Array, und druckt das Ergebnis aus. Kurz und gut, und ziemlich effizient boot:

offen (IN, "somefile.txt") -
Druck sort () -

Drucken einer Reihe von Zeilen aus einer Datei

Haben Sie schon einmal nur ein paar Zeilen aus einer Datei, und die ganze Sache nicht lesen wollte? Die folgenden Programm druckt nur eine Reihe von Linien. Sie führen das Programm mit zwei Argumente: den Bereich, den Sie und den Dateinamen möchten. Zum Beispiel, wenn Sie Ihr Programm "Showline" nennen, und Sie möchten Zeilen 10 bis 20 der somefile.txt Datei, um zu sehen, verwenden Sie diese Befehlszeile:

Showline 10-20 somefile.txt

Das folgende Programm druckt eine Reihe von Linien:

offen (IN, $ ARGV [1]) oder die "Konnte nicht $ Datei lesen. n" -
($ Start, $ Stop) = split (/ - /, $ ARGV [0]) -
for ($ i = 1- $ ILT; = $ Stop- $ i + = 1)
{$ Line = - if ($ i> = $ Start) {print $ line}}

Listing nur die Dateien in einem Verzeichnis

Manchmal können Sie die Verzeichnisse in einem Verzeichnis zu ignorieren wollen und konzentrieren sich nur auf die Dateien. Sie können die folgenden -f Datei Test verwenden, um alle Dateien in einem Verzeichnis aufzulisten:

foreach $ f (lt; *>) {if (-f $ f) {print "$ f n"}}

Eintrag ein Verzeichnis nach Größe

So sortieren, eine Verzeichnisliste von einer anderen als der Dateinamen, hat das Programm eine Liste der Datensätze zu halten, bestehend aus den Namen und andere Elemente in der Auflistung. Hashes sind für diese Art von Liste zu verwenden, die Datensätze mit einem Schlüssel (der Dateiname) und einem Wert (die andere Verzeichnisinformationen) hat. Das folgende Programm erstellt einen Hash, der die Größe der einzelnen Dateien in dem Verzeichnis aufgelistet und sortiert dann die Elemente für die Ausgabe. (Sie können dieses Programm leicht ändern nach Datum zu sortieren, anstatt nach Größe.)

foreach $ f (lt; *>) {$ i {$ f} = -s $ f} -
foreach $ k (sort {$ i {$ b} lt; = gt $ i {$ a}} Tasten% i)
{Printf "% 8d% s n", $ i {$ k}, $ k}

Sortierung Verzeichnisse nach Verlängerung

Sortierung durch einen Teil eines Dateinamens ist ein etwas schwieriger Prozess als nach Dateigröße oder dem Datum sortiert wird die Datei geändert wurde. Das folgende Programm bricht den Dateinamen in zwei und Sorten durch den zweiten Teil. Wenn Sie auf einem UNIX oder Macintosh-System Perl laufen lassen, funktioniert dieses Programm vorhersagbar nur dann, wenn die Dateinamen keine Zeit oder eine Periode haben:

foreach $ Fullname (lt; *>) {
($ Name, $ Ext) = split (/./, $ Fullname, 2) -
push (@Temp, "$ Ext t $ Fullname") -
}
foreach $ Val (sort (@Temp)) {
($ Ext, $ Fullname) = split (/ t /, $ Val) -
print "$ Fullname n" -
}

Erstellen eines einfachen Rechner

Schon eine einfache zu bedienende Rechner brauchte einige quick-and-dirty math abschlagen? Das folgende Programm verwendet Perl Funktion eval die Antworten auf jede Gleichung auszudrucken Sie eingeben. Um das Programm zu beenden, geben Sie eine leere Zeile. Hier ist das Programm für den eigenen Rechner zu erstellen:

während() {
$ I = $ _- chomp ($ i) - es sei denn, ($ i) {last}
$ O = eval ($ i) - print "Antwort = $ o n" -
}

Wenn Sie das Programm ausführen, können Sie so etwas wie die folgenden ein:

((2 ** 8) + (3 **) 8)

und Sie erhalten dieses Ergebnis:

Antwort = 6817

Randomisierung eine Liste

In Perl, Zufallszahlen zu erzeugen ist einfach, aber die Reihenfolge eines Arrays Randomisierung ist nicht so einfach. Dennoch können Sie die Splice-Funktion verwenden, um ein zufälliges Element aus einem Array zu ziehen und dann in einem anderen Array das Element platzieren. Das folgende Programm randomisiert die Liste @MyList:

my @TempList = () -
während (@MyList)
{Push (@TempList, splice (@MyList, rand (@MyList), 1))}
@MyList = @TempList;

Der Trick dabei ist, dass rand (@MyList) nimmt eine Zahl zwischen 0 und die Anzahl der Elemente in @MyList und splice ändert diese Zufallszahl auf eine ganze Zahl.

Zufalls-mnemonic Passwörter

Der Versuch, Computer-Anwender davon zu überzeugen, mit Passwörtern zu kommen, die nicht leicht zu erraten sind, ist eine der schwierigsten Jobs für einen Systemadministrator. Die Menschen scheinen immer für Passwörter mit ihren Geburtstagen oder Haustieren Namen zu bestehen - Verletzung der Sicherheit wird dann ein Kinderspiel.

Das folgende Programm generiert zufällige Passwörter. Statt eines Gewirr von schwer zu merkende Briefe, jedoch sind die Passwörter etwas mnemonic, weil sie paarweise von Konsonanten und Vokalen erscheinen, die aussprechbar sind. Durch die Bespannung ein paar doof klingender Silben zusammen, können Sie leicht zu merk erzeugen Unsinn Phrasen.

Jede Silbe des Passworts kann repräsentieren einem der 100 Zahlen- daher eine einzige viersilbigen Passwort, wie votahubo, ist einer von 100 Millionen (100 in der vierten Potenz) möglichen Passwörter generiert das Programm. ein Systemadministrator diese Passwörter vergeben haben bietet mehr Sicherheit als dass die Anwender ihre eigenen, leicht zu erraten Passwörter wählen:

print "eine Startnummer eingeben:" - $ s =-
srand ($ s ^ Zeit) -
@ C = split (/ * / "bcdfghjklmnprstvwxyz") -
@ V = split (/ * / "aeiou") -
for (i = $ 1- $ i lt; = 4- $ i + = 1)
{Print $ c [int (rand (20))], $ v [int (rand (5))]}

Die ersten beiden Zeilen dieses Programms initialisieren den Samen für die Zufallszahlen, und die nächsten zwei Zeilen erstellen Listen, die die 20 Konsonanten, die (minus q) Und 5 Vokale des Alphabets. Die for-Schleife einfach druckt die vier Silben.

Menü