Benutzer-Werkzeuge

Webseiten-Werkzeuge


perl

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte Überarbeitung Beide Seiten der Revision
perl [09.01.2016 15:19]
marc [Subroutinen mit Übergabeparametern]
perl [15.01.2016 12:27]
marc
Zeile 1: Zeile 1:
 ====== Perl ====== ====== Perl ======
 +
 +Siehe auch:
 +
 +https://wiki.selfhtml.org/wiki/Perl
  
 ===== Subroutinen mit Übergabeparametern ===== ===== Subroutinen mit Übergabeparametern =====
Zeile 32: Zeile 36:
  
   sleep(10);   sleep(10);
 +
 +===== FHEM Befehle aus perl ausführen =====
 +
 +  fhem "<FHEM-Befehl>";
 +
 +
 +===== reguläre Ausdrücke - regexp =====
 +
 +https://wiki.selfhtml.org/wiki/Perl/Regul%C3%A4re_Ausdr%C3%BCcke
 +
 +Regular Expressions - oder, auf Deutsch, reguläre Ausdrücke - dienen dazu, einen Text auf bestimmte Zeichenfolgen zu überprüfen und diese dann - bei Bedarf - zu manipulieren. Diese Suchbegriffe können durch die regexp-Syntax sehr variabel gehalten werden. Sie sind Programmiersprachen-unabhängig, soll heissen, sowohl für php als auch für Perl (als Beispiel) gelten die gleichen Regeln - nur das "Drumherum" ist anders.
 +
 +
 +Regexp setzen sich zusammen aus Literalen und aus Metazeichen. Literale sind Buchstaben, auf die exakt geprüft werden soll und die Metazeichen bringen die Variablität rein. Ein Beispiel: Die regexp /abc/ besteht nur aus Literalen: sie schlägt nur bei abc zu, Abc zB wird ignoriert, da das große A nicht dem kleinen a entspricht.
 +
 + Die - für uns vorerst wichtigen - Metazeichen sind:
 +
 +1.Allgemein:
 +  * ^ steht für den Textanfang. /^abc/ ist nur dann wahr, wenn der Text mit abc beginnt.
 +  * $ steht für das Textende. /abc$/ ist nur dann wahr, wenn der Text mit abc endet.
 +  * \b steht für eine Wortgrenze. abc ist wahr, wenn abc als eigenes Wort im Text auftaucht ("abc def ...") und falsch, wenn abc nur Teil eines Wortes ist ( "abcd ef..." )
 +  * \B ist das Gegenteil von \b. abc ist falsch, wenn abc als eigenes Wort im Text auftaucht ("abc def ...") und wahr, wenn abc nur Teil eines Wortes ist ( "abcd ef..." )
 +  * | dient als oder-Verknüpfung. /abc|xyz/ ist sowohl bei abc als auch bei xyz wahr.
 +
 +2. Wildcards, Suchbereiche:
 +  * . ( der Punkt ) steht für ein beliebiges Zeichen: /ab.c/ ist wahr, wenn im Text zB abxc, ab1c oder ab c steht. Es ist nicht wahr, wenn zwischen ab und c mehr als ein Zeichen steht.
 +  * [...] Eckige Klammern definieren einen Zeichenbereich, der für ein Zeichen im Originaltext steht. HÄH? OK, ein Beispiel: Wenn zB nach einem Herrn Maier gesucht wird, aber nicht sicher ist, ob er im Text nun Maier oder Meier geschrieben wurde, kann man ihn mittels /M[ae]ier/ suchen: Die regexp gibt sowohl beim "Meier" als auch beim "Maier" wahr zurück.
 +
 +Es können auch ganze Zeichen-Bereiche abgedeckt werden:
 + * [A-Z] trifft auf alle Großbuchstaben zu
 + * [a-z] trifft auf alle Kleinbuchstaben zu
 + * [0-9] trifft auf alle Ziffern zu
 +
 +  * ^ Jetzt wird's etwas irritierend, weil - den hatten wir doch gerade schon. Innerhalb der eckigen Klammern kommt dem ^ nämlich die Funktion des Negierens zu - die regexp gibt wahr zurück, wenn der Zeichenbereich nicht zutrifft. Auch hier ein Beispiel: /1234[^5]/  findet alle Zeichenfolgen 1234, denen keine 5 folgt.
 +
 + 3. Wiederholungsangaben:
 + Wiederholungsangaben machen die Suchbereiche und Wildcards noch flexibler. Sie werden direkt hinter der betroffenen Klammer bzw dem Punkt/Stern angegeben.
 +  * * steht für beliebig oft oder gar nicht. Beispiel: /abc[x]*d/ ist wahr, wenn zwischen abc und d gar nichts oder ein oder mehrere x stehen - es ist falsch, wenn irgendein anderes Zeichen dazwischen steht.
 +  * + hat im Prinzip die gleiche Wirkung wie das *, nur das in diesem Fall die Suchzeichen mindestens einmal auftreten müssen. Beispiel: /.+/ ist wahr, wenn mindestens ein beliebiges Zeichen vorhanden ist.
 +  * ? bedeutet: Kann da sein, muss aber nicht. Im Prinzip also wieder wie das *, nur das hier die maximale Trefferlänge 1 beträgt.
 +  * {n1,n2} schränkt den Grössenspielraum ein: n1 steht für die Mindestanzahl Treffer, n2 für die Maximalanzahl. Die Maximalanzahl kann bB weggelassen werden. Mit Komma ( "{n1,}" ) wird die regexp wahr, wenn die Fundstelle mindestens n1 Zeichen lang ist. Ohne Komma ( "{n1}" ) wird sie wahr, wenn genau n1 Zeichen gefunden werden.
 +
 + 4. Maskieren
 + Es kann natürlich vorkommen, daß mit der regexp Zeichen gesucht werden, die innerhalb der regexp eine eigene Funktion haben ( Beispiel: . - der Punkt. ). Diesen Zeichen wird durch einen vorgestellten Backslash (\. ) die Metazeichen-Funktion genommen und in ein ganz normales Literal umgewandelt.
 +
 +
 +Beispiel:
 +
 +Nehmen wir mal an, wir hätten ein riesengrosses Logfile und wollen aus diesem alle IP-Adressen rausfiltern. 
 +
 + IP-Adressen sind nach einem recht einfachen Schema aufgebaut: Vier 1-3stellige Zahlen, die jeweils durch einen Punkt getrennt sind. ( An die Netzwerkgurus: Ich weiß, daß es etwas komplizierter ist, aber für's erste Beispiel reicht diese Definition...  )
 +
 + Hmm...
 +
 + Ziffern können durch [0-9] ermittelt werden. Die Anzahl kann durch die geschweiften Klammern eingeschränkt werden. Also wird eine der Zahlengruppen durch [0-9]{1,3} definiert. Da der Punkt eine regexp-Sonderfunktion hat, müssen wir ihn mit dem Backslash maskieren. Das war's eigentlich schon, um die regexp festzulegen:
 +
 +/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/
 +
 + Eigentlich simpel, oder? 
 +
 +
 + Nun gut, jetzt wissen wir, daß eine Zeile eine IP_Adresse enthält, wissen aber noch nicht, welche IP-Adresse das ist. Dafür dienen die runden Klammern (...). Alle Treffer - seien es nun Literale oder (umgesetzte) Metazeichen - die innerhalb dieser runden Klammern stehen, werden an das aufrufende Script übergeben ( $1,$2... bei Perl, bei PHP im angegebenen Zielarray ). Also würde uns die regexp
 +
 +/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/
 +
 + die IP-Adresse in der jeweiligen Variablen zurückliefern.
 +
 +
 +
perl.txt · Zuletzt geändert: 16.01.2016 10:06 von marc