Was sind einige wirklich nützliche, aber esoterische Sprachfunktionen in Perl, die Sie tatsächlich einsetzen konnten, um nützliche Arbeit zu leisten?
Richtlinien:
- Versuchen Sie, die Antworten auf den Perl-Kern und nicht auf CPAN zu beschränken
- Bitte geben Sie ein Beispiel und eine kurze Beschreibung
Versteckte Funktionen finden Sie auch in den versteckten Funktionen anderer Sprachen:
(Dies sind alles aus Corions Antwort )
- C.
- Duffs Gerät
- Portabilität und Standardität
- C #
- Anführungszeichen für durch Leerzeichen getrennte Listen und Zeichenfolgen
- Aliasable Namespaces
- Java
- Statische Initialisierer
- JavaScript
- Funktionen sind Bürger erster Klasse
- Blockumfang und Verschluss
- Indirekter Aufruf von Methoden und Accessoren über eine Variable
- Rubin
- Methoden durch Code definieren
- PHP
- Durchdringende Online-Dokumentation
- Magische Methoden
- Symbolische Referenzen
- Python
- Ein Zeilenwert tauschen
- Möglichkeit, auch Kernfunktionen durch eigene Funktionen zu ersetzen
Andere versteckte Funktionen:
Betreiber:
- Der Bool-Quasi-Operator
- Der Flip-Flop-Operator
- Wird auch für die Listenerstellung verwendet
- Die
++
und unäre-
Operatoren arbeiten an Zeichenfolgen - Der Wiederholungsoperator
- Der Raumschiffbetreiber
- Die || operator (und // operator), um aus einer Reihe von Auswahlmöglichkeiten auszuwählen
- Der Diamantoperator
- Sonderfälle des
m//
Betreibers - Der Tilde-Tilde "Operator"
Konstrukte zitieren:
- Der qw-Operator
- Buchstaben können als Anführungszeichen in q {} -ähnlichen Konstrukten verwendet werden
- Angebotsmechanismen
Syntax und Namen:
- Nach einem Siegel kann ein Leerzeichen stehen
- Sie können numerische Namen mit symbolischen Referenzen angeben
- Rechtliche nachgestellte Kommas
- Gruppierte Integer-Literale
- Hash-Scheiben
- Auffüllen von Schlüsseln eines Hash aus einem Array
Module, Pragmas und Befehlszeilenoptionen:
- Verwenden Sie strenge und Warnungen
- Verschmutzungsprüfung
- Esoterische Verwendung von -n und -p
- CPAN
overload::constant
- IO :: Handle-Modul
- Sichere Fächer
- Attribute
Variablen:
- Autovivifizierung
- Die
$[
Variable - Krawatte
- Dynamisches Scoping
- Variablentausch mit einer einzigen Anweisung
Schleifen und Flusskontrolle:
Reguläre Ausdrücke:
Andere Eigenschaften:
- Der Debugger
- Spezielle Codeblöcke wie BEGIN, CHECK und END
- Der
DATA
Block - Neue Blockoperationen
- Quellfilter
- Signalhaken
- Karte ( zweimal )
- Integrierte Funktionen einschließen
- Die
eof
Funktion - Die
dbmopen
Funktion - Warnungen in Fehler verwandeln
Andere Tricks und Meta-Antworten:
Siehe auch:
perl
hidden-features
Adam Bellaire
quelle
quelle
Antworten:
Der Flip-Flop-Operator ist nützlich, um die erste Iteration zu überspringen, wenn Sie die von einem Dateihandle zurückgegebenen Datensätze (normalerweise Zeilen) durchlaufen, ohne eine Flag-Variable zu verwenden:
Führen Sie aus
perldoc perlop
und suchen Sie nach "Flip-Flop" für weitere Informationen und Beispiele.quelle
Es gibt viele nicht offensichtliche Funktionen in Perl.
Wussten Sie zum Beispiel, dass nach einem Siegel ein Leerzeichen stehen kann?
Oder dass Sie untergeordnete numerische Namen vergeben können, wenn Sie symbolische Referenzen verwenden?
Es gibt auch den Quasi-Operator "bool", der 1 für wahre Ausdrücke und die leere Zeichenfolge für false zurückgibt:
Andere interessante Dinge: Mit können
use overload
Sie String-Literale und Zahlen überladen (und zum Beispiel BigInts oder was auch immer machen).Viele dieser Dinge sind tatsächlich irgendwo dokumentiert oder folgen logisch den dokumentierten Funktionen, aber einige sind nicht sehr bekannt.
Update : Noch ein schönes. Im Folgenden wurden die
q{...}
zitierenden Konstrukte erwähnt, aber wussten Sie, dass Sie Buchstaben als Trennzeichen verwenden können?Ebenso können Sie reguläre Ausdrücke schreiben:
quelle
Unterstützung für komprimierte Dateien über Magic ARGV hinzufügen :
(Anführungszeichen um $ _, die erforderlich sind, um Dateinamen mit Shell-Metazeichen in zu verarbeiten)
Jetzt
<>
dekomprimiert die Funktion alle@ARGV
Dateien, die mit ".gz" oder ".Z" enden:quelle
|
im Ersatz entkommen müssen .zcat |
als Befehl zum Durchleiten analysiert?@ARGV
Eine meiner Lieblingsfunktionen in Perl ist die Verwendung des Booleschen
||
Operators, um zwischen einer Reihe von Auswahlmöglichkeiten zu wählen.Das heißt, man kann schreiben:
den ersten wahren Wert nehmen aus
$a
,$b
und$c
, oder einen Standardwert von0
sonst.In Perl 5.10 gibt es auch den
//
Operator, der die linke Seite zurückgibt, wenn sie definiert ist, und die rechte Seite, wenn sie definiert ist. Die folgenden wählt der erste definierte Wert aus$a
,$b
,$c
, oder0
anders:Diese können auch mit ihren Kurzformblättern verwendet werden, die für die Bereitstellung von Standardeinstellungen sehr nützlich sind:
Cheerio,
Paul
quelle
Die Operatoren ++ und unary - arbeiten nicht nur mit Zahlen, sondern auch mit Zeichenfolgen.
druckt -a
Drucke b
druckt aa
quelle
--
also nicht mit Saiten.ord()
. Oder schreiben Sie eine kleine Klasse und überladen Sie die Operatoren, um dies für Sie zu tun.Da Perl fast alle "esoterischen" Teile aus den anderen Listen hat, werde ich Ihnen das eine sagen, was Perl nicht kann:
Das einzige, was Perl nicht tun kann, ist, bloße beliebige URLs in Ihrem Code zu haben, da der//
Operator für reguläre Ausdrücke verwendet wird.Für den Fall, dass Ihnen nicht klar war, welche Funktionen Perl bietet, finden Sie hier eine Auswahlliste der möglicherweise nicht ganz offensichtlichen Einträge:
Duffs Gerät - in Perl
Portabilität und Standardität - Es gibt wahrscheinlich mehr Computer mit Perl als mit einem C-Compiler
Eine Datei- / Pfadmanipulationsklasse - File :: Find funktioniert unter noch mehr Betriebssystemen als .Net
Anführungszeichen für durch Leerzeichen getrennte Listen und Zeichenfolgen - Mit Perl können Sie nahezu beliebige Anführungszeichen für Ihre Listen- und Zeichenfolgenbegrenzer auswählen
Aliasable Namespaces - Perl hat diese durch Glob-Zuweisungen:
Statische Initialisierer - Perl kann Code in fast jeder Phase der Kompilierung und Objektinstanziierung ausführen, von
BEGIN
(Code-Analyse) überCHECK
(nach Code-Analyse) bisimport
(beim Modulimport) bisnew
(Objekt-Instanziierung) bisDESTROY
(Objektzerstörung) bisEND
(Programm-Exit).Funktionen sind erstklassige Bürger - genau wie in Perl
Blockumfang und Verschluss - Perl hat beides
Indirekter Aufruf von Methoden und Accessoren über eine Variable - Perl macht das auch:
Methoden durch Code definieren - Perl erlaubt das auch :
Durchdringende Online-Dokumentation - Die Perl-Dokumentation ist online und wahrscheinlich auch auf Ihrem System
Magische Methoden , die aufgerufen werden, wenn Sie eine "nicht vorhandene" Funktion aufrufen - Perl implementiert dies in der AUTOLOAD-Funktion
Symbolische Hinweise - Sie sollten sich von diesen fernhalten. Sie werden deine Kinder essen. Aber natürlich können Sie mit Perl Ihren Kindern blutrünstige Dämonen anbieten.
Einzeiliger Wertaustausch - Perl ermöglicht die Listenzuweisung
Möglichkeit, auch Kernfunktionen durch eigene Funktionen zu ersetzen
oder
quelle
Autovivifizierung . AFAIK keine andere Sprache hat es .
quelle
Es ist einfach, fast jede Art von seltsamer Zeichenfolge in Perl zu zitieren.
Tatsächlich sind die verschiedenen Zitiermechanismen in Perl sehr interessant. Mit den Perl-Regex-ähnlichen Anführungszeichen können Sie alles unter Angabe der Trennzeichen zitieren. Sie können fast jedes Sonderzeichen wie #, / oder Open / Close-Zeichen wie (), [] oder {} verwenden. Beispiele:
Angebotsmechanismen:
q: wörtliches Zitat; Das einzige Zeichen, das maskiert werden muss, ist das Endzeichen. qq: ein interpretiertes Zitat; verarbeitet Variablen und Escapezeichen. Ideal für Zeichenfolgen, die Sie zitieren müssen:
qx: Funktioniert wie qq, führt es dann aber nicht interaktiv als Systembefehl aus. Gibt den gesamten vom Standard ausgegebenen Text zurück. (Die Umleitung wird, sofern sie im Betriebssystem unterstützt wird, ebenfalls ausgegeben.) Wird auch mit Anführungszeichen (das Zeichen `) ausgeführt.
qr: Interpretiert wie qq, kompiliert es dann aber als regulären Ausdruck. Funktioniert auch mit den verschiedenen Optionen auf dem regulären Ausdruck. Sie können den regulären Ausdruck jetzt als Variable weitergeben:
qw: Ein sehr, sehr nützlicher Anführungszeichenoperator. Verwandelt einen zitierten Satz von durch Leerzeichen getrennten Wörtern in eine Liste. Ideal zum Ausfüllen von Daten in einem Unit-Test.
Sie sind großartig, wenn sie die Dinge klarer machen. Für qx, qq und q verwende ich höchstwahrscheinlich die Operatoren {}. Die häufigste Gewohnheit von Menschen, die qw verwenden, ist normalerweise der Operator (), aber manchmal sehen Sie auch qw //.
quelle
my $moreout = qx{type "$path" 2>&1};
... Ich wusste nicht, dass du das kannst! [TM]Nicht wirklich versteckt, aber viele Perl-Programmierer wissen jeden Tag nichts über CPAN . Dies gilt insbesondere für Personen, die keine Vollzeitprogrammierer sind oder nicht in Vollzeit in Perl programmieren.
quelle
Die "for" -Anweisung kann genauso verwendet werden wie "with" in Pascal:
Sie können eine Folge von s /// Operationen usw. auf dieselbe Variable anwenden, ohne den Variablennamen wiederholen zu müssen.
HINWEIS: In dem nicht unterbrechenden Bereich darüber (& nbsp;) ist Unicode versteckt, um den Markdown zu umgehen. Nicht kopieren, einfügen :)
quelle
Der Zitatwortoperator ist eines meiner Lieblingssachen. Vergleichen Sie:
und
Viel weniger Lärm, schont das Auge. Eine andere wirklich schöne Sache an Perl, die man beim Schreiben von SQL wirklich vermisst, ist, dass ein nachfolgendes Komma legal ist:
Das sieht seltsam aus, aber nicht, wenn Sie den Code anders einrücken:
Wenn Sie dem Funktionsaufruf ein zusätzliches Argument hinzufügen, müssen Sie nicht mit Kommas in vorherigen oder nachfolgenden Zeilen herumspielen. Die Änderung einer einzelnen Linie hat keine Auswirkungen auf die umgebenden Linien.
Dies macht es sehr angenehm, mit verschiedenen Funktionen zu arbeiten. Dies ist möglicherweise eine der am meisten unterbewerteten Funktionen von Perl.
quelle
for (<a list of stuff>) { ... }
Die Möglichkeit, Daten zu analysieren, die direkt in einen DATA- Block eingefügt wurden . Sie müssen nicht in einer Testdatei speichern, um sie im Programm oder ähnlichem zu öffnen. Beispielsweise:
quelle
Neue Blockoperationen
Ich würde sagen, dass die Möglichkeit, die Sprache zu erweitern und Pseudoblockoperationen zu erstellen, eine ist.
Sie deklarieren den Prototyp für ein Sub, der angibt, dass zuerst eine Code-Referenz erforderlich ist:
Sie können es dann im Körper so nennen
((
Data::Dumper::Dumper
ist ein weiteres halb verstecktes Juwel.) Beachten Sie, dass Sie dassub
Schlüsselwort vor dem Block oder das Komma vor dem Hash nicht benötigen . Es sieht am Ende sehr ähnlich aus wie:map { } @list
Quellfilter
Es gibt auch Quellfilter. Wo Perl Ihnen den Code übergibt, damit Sie ihn bearbeiten können. Sowohl dies als auch die Blockoperationen sind so ziemlich Dinge, die man nicht zu Hause ausprobieren sollte.
Ich habe einige nette Dinge mit Quellfiltern gemacht, zum Beispiel das Erstellen einer sehr einfachen Sprache zum Überprüfen der Uhrzeit, die kurze Perl-Einzeiler für einige Entscheidungen zulässt:
Lib::TL
Ich würde nur nach den "Variablen" und den Konstanten suchen, sie erstellen und sie nach Bedarf ersetzen.Auch hier können Quellfilter chaotisch sein, sind aber leistungsstark. Aber sie können Debugger etwas Schreckliches durcheinander bringen - und sogar Warnungen können mit den falschen Zeilennummern gedruckt werden. Ich habe aufgehört, Damians Schalter zu benutzen weil der Debugger nicht mehr in der Lage war, mir zu sagen, wo ich wirklich war. Ich habe jedoch festgestellt, dass Sie den Schaden minimieren können, indem Sie kleine Codeabschnitte ändern und sie in derselben Zeile halten.
Signalhaken
Es wird oft genug gemacht, aber es ist nicht so offensichtlich. Hier ist ein Würfelführer, der sich auf den alten stützt.
Das heißt, wenn ein anderes Modul im Code sterben möchte, muss es zu Ihnen kommen (es sei denn, jemand anderes führt ein destruktives Überschreiben durch
$SIG{__DIE__}
). Und Sie können benachrichtigt werden, dass jemand etwas falsch macht.Natürlich können Sie für genügend Dinge nur einen
END { }
Block verwenden, wenn Sie nur aufräumen möchten.overload::constant
Sie können Literale eines bestimmten Typs in Paketen überprüfen, die Ihr Modul enthalten. Wenn Sie dies beispielsweise in Ihrem
import
Sub verwenden:Dies bedeutet, dass jede Ganzzahl, die größer als 2 Milliarden in den aufrufenden Paketen ist, in ein
Math::BigInt
Objekt geändert wird. (Siehe Überladung :: Konstante ).Gruppierte Integer-Literale
Während wir dabei sind. Mit Perl können Sie große Zahlen in dreistellige Gruppen aufteilen und trotzdem eine analysierbare Ganzzahl daraus erhalten. Anmerkung
2_000_000_000
oben für 2 Milliarden.quelle
->slice
jedes Mal als Methode verwenden müssen, wenn ein Slice benötigt wird.Binäres "x" ist der Wiederholungsoperator :
Es funktioniert auch mit Listen:
quelle
Verschmutzungsprüfung. Wenn die Verschmutzungsprüfung aktiviert ist, stirbt Perl (oder warnt mit
-t
Wenn die ), wenn Sie versuchen, verdorbene Daten (grob gesagt Daten von außerhalb des Programms) an eine unsichere Funktion zu übergeben (Öffnen einer Datei, Ausführen eines externen Befehls usw.). Dies ist sehr hilfreich, wenn Sie Setuid-Skripte oder CGIs schreiben oder wenn das Skript über größere Berechtigungen verfügt als die Person, die es mit Daten versorgt.Magie gehe.
goto &sub
führt einen optimierten Tail Call durch.Der Debugger.
use strict
unduse warnings
. Diese können Sie vor einer Reihe von Tippfehlern bewahren.quelle
Basierend auf der Art
"-n"
und Weise der und"-p"
Schalter in Perl 5 implementiert sind, können Sie ein scheinbar falsches Programm schreiben, einschließlich}{
:welches intern in diesen Code konvertiert wird:
quelle
Beginnen wir einfach mit dem Raumschiff-Operator .
quelle
($a->lname cmp $b->lname) || ($a->fname cmp $b->fname)
sortiert Menschen , die von ihren Nachnamen, aber wenn zwei Personen den gleichen Nachnamen haben , dann werden sie mit dem Vornamen bestellt werden.Dies ist eine Meta-Antwort, aber die Perl-Tipps Archive enthalten alle möglichen interessanten Tricks, die mit Perl ausgeführt werden können. Das Archiv der vorherigen Tipps ist online zum Durchsuchen und kann über eine Mailingliste oder einen Atom-Feed abonniert werden.
Einige meiner besten Tipps umfassen den Aufbau Executables mit PAR , mit autodie Ausnahmen automatisch zu werfen , und die Verwendung der Schalter und Smart-match - Konstrukte in Perl 5.10.
Offenlegung: Ich bin einer der Autoren und Betreuer von Perl-Tipps, daher schätze ich sie offensichtlich sehr. ;)
quelle
map - nicht nur, weil es den eigenen Code ausdrucksvoller macht, sondern weil es mir den Impuls gab, ein bisschen mehr über diese "funktionale Programmierung" zu lesen.
quelle
Die continue-Klausel für Schleifen. Es wird am Ende jeder Schleife ausgeführt, auch bei den nächsten.
quelle
Meine Stimme würde für die Gruppen (? {}) Und (?? {}) in Perls regulären Ausdrücken gehen. Der erste führt Perl-Code aus, wobei der Rückgabewert ignoriert wird, der zweite führt Code aus und verwendet den Rückgabewert als regulären Ausdruck.
quelle
s/(pattern)/reverse($1);/ge;
# kehrt alles umpatterns
.uninames
,unichars
und vor allemuniprops
, um nur einen Teil dessen zu sehen, was ich meine.der \ G Anker. Es ist heiß .
quelle
Der
m//
Bediener hat einige obskure Sonderfälle:?
als Trennzeichen verwenden, stimmt es nur einmal überein, es sei denn, Sie rufen anreset
.'
als Trennzeichen verwenden, wird das Muster nicht interpoliert.quelle
Der Null-Dateihandle- Diamantoperator
<>
hat seinen Platz beim Erstellen von Befehlszeilenwerkzeugen. Es verhält sich wie<FH>
das Lesen aus einem Handle, mit der Ausnahme, dass es auf magische Weise auswählt, was zuerst gefunden wird: Befehlszeilendateinamen oder STDIN. Entnommen aus Perlop:quelle
perl myscript.pl file1.txt - file2.txt
, und Perl würde die erste Datei verarbeiten, dann stdin, dann die zweite Datei.overload
den<>
Operator für Ihre eigenen Objekte (<$var>
) wie einen Iterator verwenden. Es funktioniert jedoch nicht wie im Listenkontext zu erwarten.Spezielle Codeblöcke wie
BEGIN
,CHECK
undEND
. Sie kommen von Awk, funktionieren aber in Perl anders, weil es nicht auf Aufzeichnungen basiert.Der
BEGIN
Block kann verwendet werden, um Code für die Analysephase anzugeben. Es wird auch ausgeführt, wenn Sie die Syntax- und Variablenprüfung durchführenperl -c
. Zum Laden von Konfigurationsvariablen:quelle
benennt data.txt.part in data.txt um, ohne mich wiederholen zu müssen.
quelle
Ein bisschen dunkel ist der Tilde-Tilde- "Operator", der den skalaren Kontext erzwingt.
ist das gleiche wie
und anders als
quelle
~~
, der Regex-Übereinstimmungen ausführen kann, prüfen kann, ob ein Element in einem Array enthalten ist und so weiter.tie, die variable Bindungsschnittstelle.
quelle
Der "Verzweiflungsmodus" von Perls Schleifensteuerungskonstrukten, der sie veranlasst, den Stapel nachzuschlagen, um ein passendes Etikett zu finden, ermöglicht einige merkwürdige Verhaltensweisen, die Test :: More zum Guten oder Schlechten ausnutzt.
Es gibt die wenig bekannte PMC-Datei. "use Foo" sucht in FIN.pmc in @INC vor Foo.pm. Dies sollte ermöglichen, dass zuerst kompilierter Bytecode geladen wird, aber Module :: Compile nutzt dies jedoch, um quellgefilterte Module für schnellere Ladezeiten und einfacheres Debuggen zwischenzuspeichern.
Die Fähigkeit, Warnungen in Fehler umzuwandeln.
Das ist es, woran ich denken kann, was nicht erwähnt wurde.
quelle
Der Ziegenbetreiber
*
:oder
Dies funktioniert, weil die Listenzuweisung im skalaren Kontext die Anzahl der Elemente in der Liste ergibt, die zugewiesen werden.
*
Beachten Sie, nicht wirklich ein Operatorquelle