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
perl [09.01.2016 15:02]
marc [Systemaufruf]
perl [16.01.2016 10:06]
marc [Optionale Parameter in sub()]
Zeile 1: Zeile 1:
 ====== Perl ====== ====== Perl ======
 +
 +Siehe auch:
 +
 +https://wiki.selfhtml.org/wiki/Perl
  
 ===== Subroutinen mit Übergabeparametern ===== ===== Subroutinen mit Übergabeparametern =====
Zeile 8: Zeile 12:
   }   }
  
 +Oder mit shift
  
 +  sub routine($$) {
 +    my $parameter1 = shift;
 +    my $parameter2 = shift;
 +    ...
 +  }
 ===== Systemaufruf ===== ===== Systemaufruf =====
  
-  #-- calling 'command' with arguments+==== system ==== 
 + 
 +Bei system() bleibt das Perl-Programm während des Ausführung des Kommandos stehen, pausiert sozusagen. 
 + 
 +  # calling 'command' with arguments
   system("command arg1 arg2 arg3");   system("command arg1 arg2 arg3");
  
-  #-- better way of calling the same command+  # better way of calling the same command
   system("command", "arg1", "arg2", "arg3");   system("command", "arg1", "arg2", "arg3");
 +  
 +===== Sleep =====
 +
 +Sleep lässt das Script für <Sekunden> warten:
 +
 +  sleep(10);
 +
 +===== FHEM Befehle aus perl ausführen =====
 +
 +  fhem "<FHEM-Befehl>";
 +
 +
 +
 +===== Optionale Parameter in sub() =====
 +
 +
 +  sub defineUhrzeitAnsage ($;$$){
 +    my ($player, $count, $volume) = @_;
 +    
 +    #Standardwert für String setzen, wenn nicht übergeben
 +    $volume //= "40";
 +  
 +    #Standardwert für Integer setzen, wenn nicht übergeben
 +    $count = 0 unless $count;
 +    ...
 +    }
 +
 +===== 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