Inhaltsverzeichnis

Perl

Siehe auch:

https://wiki.selfhtml.org/wiki/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:

2. Wildcards, Suchbereiche:

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

3. Wiederholungsangaben: Wiederholungsangaben machen die Suchbereiche und Wildcards noch flexibler. Sie werden direkt hinter der betroffenen Klammer bzw dem Punkt/Stern angegeben.

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.