Benutzer-Werkzeuge

Webseiten-Werkzeuge


perl

Perl

Subroutinen mit Übergabeparametern

sub routine($$) {
  my ($parameter1, $parameter2) = @_;
  ...
}

Oder mit shift

sub routine($$) {
  my $parameter1 = shift;
  my $parameter2 = shift;
  ...
}

Systemaufruf

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");
# better way of calling the same command
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