archive-de.com » DE » E » EKIWI.DE

Total: 422

Choose link from "Titles, links and description words view":

Or switch to "Titles and links view".
  • SELFHTML: Perl / Perl-Sprachelemente / Objektorientiertes Programmieren
    den Zeiger an das Objekt binden kann Nun ist die Frage wie aus der skalaren Variable Referenz eine Referenz werden soll Sie muss sich ja auf irgendetwas beziehen worauf sie zeigt Ideal ist für diesen Zweck die Zuweisung Dies ist einfach eine Referenz auf einen leeren unbenannten Hash Ideal ist das deshalb weil dieser Hash auch für die Definition von Objektdaten geeignet ist was allerdings in diesem ersten einfachen Beispiel noch nicht geschieht So bleibt es bei dem leeren Hash und Referenz ist ein Zeiger Mit bless Referenz Objekt wird die nötige Verbindung zwischen Referenz und Objekt hergestellt Anschließend wird Referenz zurückgegeben Die vier übrigen Subroutinen in der Moduldatei HTMLprint pm sind sich alle recht ähnlich Sie erzeugen mit Hilfe von print Anweisungen HTML Code Die Subroutine Anfang schreibt zudem zunächst den nötigen HTTP Header für HTML Ausgaben Für alle Subroutinen die als Methoden eines Objekts fungieren gilt sie bekommen automatisch mindestens einen Parameter übergeben und zwar den Zeiger auf das Objekt der in der Konstruktor Funktion erzeugt und an das Objekt gebunden wurde Die Subroutinen im Beispiel benötigen diesen Zeiger nicht Aber Anfang Titel und Text erwarten noch einen zweiten ganz gewöhnlichen Parameter nämlich den Inhalt den sie in HTML ausgeben sollen Nun könnten sich die Routinen den Inhalt dieses zweiten Parameters auch direkt mit 1 holen Aber die Notation mit dem Aufruf der shift Funktion hat den Vorteil dass die Parameterliste dabei sauber abgearbeitet und der Reihe nach gelöscht wird Mit dem jeweils zweiten Aufruf von shift kommen die drei erwähnten Subroutinen also an den zweiten Parameter Wichtig zu erwähnen ist noch dass pm Moduldateien am Ende stets eine einsame Anweisung 1 oder etwas ähnliches enthalten müssen Das bedeutet die Moduldatei gibt einen wahren Wert zurück Andernfalls würde der Perl Interpreter einen Fehler melden Das eigentliche Perl Script ist im Beispiel recht einfach Mit der Funktion use und der Anweisung use HTMLprint bindet es die Moduldatei HTMLprint pm ein In dieser Form eingebunden muss sich die HTMLprint pm entweder im gleichen Verzeichnis befinden wie das Script oder in einem der zentralen Verzeichnisse in denen Perl nach Modulen sucht mehr darüber im Abschnitt Speicherorte für Module und die Liste INC Mit my html HTMLprint new wird die Konstruktorfunktion der Moduldatei aufgerufen Dies ist die entscheidende Anweisung mit der eine neue Istanz des HTMLprint Objekts erzeugt wird Die Anweisung besteht darin dass ein Skalar der im Beispiel den Namen html erhält deklariert und mit einem Wert initialisiert wird Der zugewiesene Wert besteht darin dass der Name der gewünschten Objektklasse also HTMLprint mit Hilfe des Zeigeoperators auf die Konstruktorfunktion new zeigt Da die Konstruktorfunktion eine Referenz zurückgibt die durch den bless Aufruf an das Objekt gebunden ist wird html automatisch zu einer Referenz also zu einem Zeiger auf die neu erzeugte Objektinstanz Über html und den Zeigeoperator kann das Script fortan auf die Subroutinen des eingebundenen Moduls zugreifen Im Objektzusammenhang spricht man allerdings nicht mehr von Subroutinen sondern von Methoden Mit einer Anweisung wie html Anfang Ganz elegantes Perl greift das Script also auf eine Methode des HTMLprint Objekts zu und zwar auf die Objektinstanz die an den Zeiger html gebunden ist Beispiel mit Objektdaten das VCard Objekt Das folgende Beispiel zeigt wie sich Daten mit Objekten verwalten lassen Es handelt sich dabei um Adressdaten im international standardisierten VCard Format typische Dateiendung vcf wie es vom Internet Mail Consortium IMC entwickelt und in der RFC 2426 beschrieben wird In der Moduldatei VCard pm wird die VCard Klasse mit den Objektdaten und Methoden definiert Im Hauptscript werden dann zwei Objektinstanzen dieser Klasse angelegt und die Methoden des Objekts werden ausprobiert Beispiel der Moduldatei VCard pm package VCard Objekte 0 sub new my Objekt shift my Version shift my Referenz bless Referenz Objekt Objekte 1 Referenz VCinit Version return Referenz sub VCinit my Objekt shift my Version shift Objekt BEGIN VCARD Objekt VERSION Version Objekt END VCARD sub VCset my Objekt shift my Schluessel shift my Wert shift Objekt Schluessel Wert sub VCget my Objekt shift my Schluessel shift return Objekt Schluessel sub VCsave my Objekt shift my Datei shift open DATEI Datei or return 1 print DATEI BEGIN VCARD nVERSION Objekt VERSION n while my Schluessel my Wert each Objekt next if Schluessel eq BEGIN or Schluessel eq VERSION or Schluessel eq END Schluessel s g print DATEI Schluessel Wert n print DATEI END VCARD n close DATEI return Datei sub VCopen my Objekt shift my Datei shift Objekt VCreset open DATEI Datei or return my Zeilen DATEI close DATEI foreach Zeilen my Schluessel my Wert split Schluessel s g Objekt Schluessel Wert return Objekt sub VCreset my Objekt shift Objekt 1 Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser use VCard print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title head body n print h1 Tests mit dem VCard Objekt h1 n my Thilo VCard new 3 0 my Ina VCard new 3 0 print p b Wert der im Modul erzeugte Objekteigenschaft BEGIN b Ina BEGIN br n my Sicherung Ina BEGIN Ina BEGIN fangen wir an print b BEGIN nach der Wert auml nderung b Ina BEGIN br n Ina BEGIN Sicherung print Da dies aber Unsinn ist wurde der Wert wieder auf Ina BEGIN gesetzt p n Thilo VCset FN Thilo Teufel Thilo VCset TEL CELL VOICE 0170 398373740 Ina VCset FN Ina Bikina Ina VCset EMAIL PREF INTERNET bikina example org print p b Name b Thilo VCget FN br n print b Handy b Thilo VCget TEL CELL VOICE p n print p b Name b Ina VCget FN br n print b Handy b Ina VCget EMAIL PREF INTERNET p n print p b Anzahl angelegter Objekte b VCard Objekte p n if my Datei Thilo VCsave daten vcard teufel vcf print p VCard von Thilo Teufel in tt Datei tt gespeichert br else print VCard von Thilo Teufel

    Original URL path: http://html.ekiwi.de/perl/sprache/objekte.htm (2016-04-25)
    Open archived version from archive


  • SELFHTML: Perl / Funktionsreferenz / Funktionen für Datei- und Verzeichnis-Management
    eine Datei seit Programmstart nicht geändert wurde Rückgabewert ist die Zeit in Tagen als Gleitpunktzahl printf seit 3f Tagen nicht modifiziert M Datei Für die Datei Datei wird ausgegeben wie lange sie nicht mehr verändert wurde o O Unix spezifisch ermittelt ob die Datei der effektiven UID o bzw der realen UID O gehört Verarbeiten if o text txt Wenn die Datei text txt der effektiven UID gehört wird eine Subroutine aufgerufen r R Unix spezifisch ermittelt ob die effektive UID GID r bzw die reale UID GID R Leserecht für die Datei besitzt open FILE text txt if r text txt Wenn die effektive UID GID Leserecht auf die Datei text txt hat wird sie zum Lesen geöffnet p Unix spezifisch ermittelt ob es sich um eine named pipe FIFO handelt print pipe if p myprog Wenn die Datei myprog eine named pipe ist wird dies ausgegeben S Unix spezifisch ermittelt ob die Datei eine Socket Datei ist wird von Client Server Prozessen die auf einem Rechner laufen als Schnittstelle benutzt next if S Wenn die aktuelle Datei innerhalb einer angenommenen Schleife zur Überprüfung von allen Verzeichniseinträgen ein Socket ist startet der nächste Schleifendurchgang s ermittelt die Dateigröße in Bytes print s DirEintrag if not d DirEintrag Wenn der Verzeichniseintrag DirEintrag kein Verzeichnis ist wird die Dateigröße ausgegeben T ermittelt ob es sich um eine Textdatei handelt Verarbeiten if T text txt Wenn die Datei text txt eine Textdatei ist wird eine Subroutine aufgerufen t Unix spezifisch ermittelt ob der Verzeichniseintrag ein tty d h ein angeschlossenes Gerät Terminal ist unter Unix werden Peripheriegeräte als Dateien behandelt print STDIN ist tty if t STDIN Wenn der Standardeingabekanal tty ist wird dies ausgegeben u Unix spezifisch ermittelt ob bei einer Datei das setuid Bit Set User ID Bit gesetzt ist die kein uid Bit if not u text pl Wenn bei der Datei text pl kein setuid Bit gesetzt ist wird das Script mit einer Fehlermeldung beendet w W Unix spezifisch ermittelt ob die effektive UID GID w bzw die reale UID GID W Schreibrecht für die Datei besitzt open FILE text txt if W text txt Wenn die reale UID GID für die Datei text txt Schreibrechte besitzt wird sie zum Schreiben geöffnet x X Unix spezifisch ermittelt ob die effektive UID GID x bzw die reale UID GID X Ausführrecht für die Datei besitzt system myprog if x myprog Wenn die effektive UID GID für die Datei myprog Rechte zum Ausführen der Datei besitzt wird sie über einen system Aufruf ausgeführt z ermittelt ob eine Datei leer ist also 0 Bytes hat open FILE text txt if not z text txt Wenn die Datei text txt nicht leer ist wird sie zum Lesen geöffnet chdir Verzeichnis wechseln Macht ein Verzeichnis zum aktuellen Arbeitsverzeichnis So ist es möglich nach dem Wechseln in ein Verzeichnis dort abgelegte Dateien zu öffnen ohne sich um Pfadnamen kümmern zu müssen Erwartet als Parameter 1 den Pfadnamen des Verzeichnisses zu dem gewechselt werden soll Es kann sich um eine relative oder eine absolute Pfadangabe handeln Es ist auch möglich keinen Parameter zu übergeben In diesem Fall wechselt die Funktion in das Verzeichnis das in der Umgebungsvariablen HOME gespeichert ist Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser chdir usr txt rfc open DATEI rfc1867 txt my Zeilen DATEI close DATEI print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body pre n print Zeilen print pre body html n Erläuterung Das Beispielscript wechselt mit chdir in das Verzeichnis usr local txt rfc also in ein bestimmtes Unterverzeichnis ab Wurzelverzeichnis gerechnet Dort wird dann eine Datei geöffnet eingelesen und wieder geschlossen Erläuterungen zu diesen Befehlen siehe open Anschließend wird HTML Code erzeugt Dabei werden die Zeilen der eingelesenen Datei ausgegeben chmod Datei Verzeichnisrechte ändern Setzt die Rechte zum Lesen Schreiben und Ausführen einer oder mehrerer Dateien für Benutzer Benutzergruppe und Rest der Welt Unix spezifisch Erwartet als Parameter 1 eine Rechteangabe Der Wert muss numerisch oktal übergeben werden nicht als Zeichenkette 2 bis n eine oder mehrere Dateien Verzeichnisse für die diese Rechte gesetzt werden sollen wenn nötig mit Pfadnamen Gibt die Anzahl der vorgenommenen Änderungen zurück Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser my Verzeichnis usr web docs cgi bin chdir Verzeichnis print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n my Dateien glob pl my Datei foreach Datei Dateien chmod 0755 Datei print Datei auf 0755 gesetzt br n print body html n Erläuterung Das Beispiel setzt alle Perl Dateien eines CGI Verzeichnisses auf die Rechte 0755 auf vielen Servern eine sinnvolle Einstellung für CGI Scripts Zu diesem Zweck werden alle Dateien des Verzeichnisses Verzeichnis dem CGI Verzeichnis mit glob ausgewählt Die Liste Dateien in der die ausgewählten Dateien anschließend stehen wird daraufhin in einer foreach Schleife abgearbeitet Mit chmod 0755 Datei wird die jeweils aktuelle Perl Datei mit den gewünschten Rechten versehen Zur Kontrolle gibt das Beispielscript aus welche Dateien geändert wurden chown Besitzer und Besitzergruppe von Dateien ändern Jede Datei unter Unix hat einen Eigentümer der durch zwei Zahlen identifiziert wird die persönliche User ID UID und die zugehörige Gruppen ID GID Die Funktion ändert Besitzer und Besitzergruppe von einer oder mehreren Dateien Auf den meisten Unix Systemen ist dazu eine Root Kennung erforderlich Erwartet als Parameter 1 die numerische UID User ID des Besitzers 2 die numerische GID Gruppen ID der Besitzergruppe 3 bis n eine oder mehrere Dateien für die die angegebenen UID und GID gelten sollen wenn nötig mit Pfadnamen Gibt die Anzahl der vorgenommenen Änderungen zurück Beispiel usr bin perl w use strict chdir usr data web htdocs opendir DIR usr data web htdocs die n my Eintraege readdir DIR closedir DIR foreach Eintraege chown 1034 518 if f Erläuterung Das Beispiel ändert für alle regulären Dateien des angenommenen Verzeichnisses usr data web htdocs die Besitzerschaft auf den Benutzer mit der User ID 1034 und der Gruppen ID 518 chroot Wurzelverzeichnis für Pfadnamen ändern Bestimmt ein neues Verzeichnis als virtuelles Wurzelverzeichnis Absolute Pfadangaben die mit beginnen beziehen sich anschließend darauf Auf den meisten Unix Systemen ist zum Anwenden dieser Funktion eine Root Kennung erforderlich Erwartet als Parameter 1 den Pfadnamen des Verzeichnisses das zum Wurzelverzeichnis werden soll Es kann sich um eine relative oder eine absolute Pfadangabe handeln Es ist auch möglich keinen Parameter zu übergeben In diesem Fall wird der Inhalt der vordefinierten Variablen als Pfadnamen des gewünschten Verzeichnisses interpretiert Beispiel usr bin perl w use strict chroot usr local web domains eidideldum chdir opendir DIR my Eintraege readdir DIR closedir DIR foreach Eintraege print n Erläuterung Das Beispiel setzt den Pfad usr local web domains eidideldum als neues Wurzelverzeichnis Anschließend wechselt das Script mit chdir in das neue Wurzelverzeichnis Zur Kontrolle liest das Script das aktuelle Verzeichnis ein und listet die eingelesenen Verzeichniseinträge anschließend auf Erläuterungen zu diesen Befehlen siehe opendir glob Dateien mit Wildcards auswählen Wählt aus einem Verzeichnis alle Dateien aus die einem bestimmten Dateinamenmuster entsprechen Das ist wesentlich einfacher als das Operieren mit den Funktionen opendir readdir und closedir Der Nachteil von glob ist allerdings dass diese Funktion eine Unix Shell startet um an ihr Ergebnis zu kommen Die Funktion ist daher nur auf Unix Systemen verfügbar und ausführbar ist sie auch nur wenn das Script ausreichende Rechte zum Starten der Shell besitzt Es gibt jedoch bei den Standardmodulen für Dateiverwaltung ein Modul das den glob Algorithmus komplett in Perl ausführt Erwartet als Parameter 1 Das Dateinamenmuster wenn nötig mit Pfadangabe Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser my HTML Dateien glob usr web docroot htm print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n foreach HTML Dateien print br n print body html n Erläuterung Das Beispielscript wählt im Verzeichnis usr web docroot alle Dateien aus die auf htm enden Zur Kontrolle gibt das Script HTML Code mit allen eingelesenen Dateien aus Die folgende Tabelle enthält Beispiele für Dateimuster Dateimuster Bedeutung wählt alle Dateien und Verzeichnisse aus auch solche die keine Endung haben wählt alle Dateien und Verzeichnisse aus die aus Namen und Endung bestehen gif wählt alle GIF Dateien aus index wählt alle Dateien aus die index als Namen haben unabhängig von der Endung wählt alle Dateien aus deren Name aus drei Zeichen besteht unabhängig von der Endung txt wählt alle TXT Dateien aus deren Name aus vier Zeichen besteht link neue Datei als Link auf vorhandene erzeugen Die link Funktion die dem Unix Befehl ln entspricht legt aus Sicht des Benutzers eine Kopie einer Datei an Es handelt sich jedoch intern nach wie vor nur um eine einzige Datei die lediglich nunmehr unter zwei verschiedenen Namen und gegebenenfalls an zwei Stellen im Verzeichnisbaum zu finden ist Wird die Datei an einer dieser Stellen an denen sie repräsentiert wird geändert gilt die Änderung auch für die anderen Stellen an denen die Datei repräsentiert wird Wird eine der Dateien gelöscht z B mit unlink so bleiben andere Repräsentationen der Datei davon unberührt Erst wenn die letzte Repräsentation der Datei gelöscht ist ist die Datei endgültig gelöscht Erwartet als Parameter 1 die bereits existierende Datei von der eine neue Repräsentation erzeugt werden soll wenn nötig mit Pfadangabe 2 die neu zu erzeugende Repräsentation der Datei wenn nötig mit Pfadangabe Gibt 1 zurück wenn die Operation erfolgreich war und 0 wenn sie nicht erfolgreich war z B weil im Zielverzeichnis kein Schreibrecht besteht Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser my Erfolg link single txt double txt print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n Erfolg print Erfolg print kein Erfolg print body html n Erläuterung Das Beispiel wendet die Funktion link an um von der Datei single txt im aktuellen Verzeichnis eine neue Repräsentation zu erzeugen die im Verzeichnis oberhalb unter dem Namen double txt erscheint Der Rückgabewert wird in dem Skalar Erfolg gespeichert Zur Kontrolle erzeugt das Beispiel HTML Code und gibt dabei mit Hilfe einer einfachen Entweder Oder Abfrage den Erfolgsstatus der Operation an lstat Eigenschaften einer Link Datei Diese Funktion leistet das gleiche wie die Funktion stat Nähere Beschreibung und Beispiel siehe dort Im Unterschied zu stat ermittelt lstat nicht die Eigenschaften einer Datei sondern die einer Dateiverknüpfung eines so genannten symbolischen Links Wenn es sich nicht um eine Repräsentation einer Datei handelt also wenn die Datei nur einmal im Verzeichnisbaum erscheint wird beim Aufruf von lstat intern automatisch ein normaler Aufruf von stat gestartet lstat erfasst also im Gegensatz zu stat auch Dateirepräsentationen und wird deshalb in der Praxis eher eingesetzt als stat mkdir Verzeichnis erstellen Legt ein neues Verzeichnis an und ermöglicht es für das neue Verzeichnis die Rechte für Lesen Schreiben und Ausführen zu vergeben nur bei Unix Systemen wirksam Erwartet als Parameter 1 den Namen des neuen Verzeichnisses wenn nötig Pfadnamen 2 eine Rechteangabe Der Wert muss numerisch oktal übergeben werden nicht als Zeichenkette Zum Ermitteln der gewünschten Oktalzahl können Sie den Unix Dateirechte Setzer bei den kleinen Helferlein verwenden Auf Systemen die keine Unix Rechteverwaltung kennen also z B unter Windows ist der zweite Parameter bedeutungslos Gibt 1 bzw TRUE zurück wenn die Operation erfolgreich war und 0 bzw FALSE wenn das Anlegen des Verzeichnisses nicht möglich war z B weil in dem Verzeichnis in dem das Unterverzeichnis angelegt werden sollte kein Schreibrecht besteht Der genaue Fehlertext kann in diesem Fall über die vordefinierte Variable ermittelt werden Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser my Verzeichnisbaum texte texte briefe texte rechnungen texte rechnungen alt texte rechnungen neu grafiken grafiken fotos grafiken fotos fremde grafiken cliparts print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n chdir temp foreach Verzeichnisbaum mkdir 0777 print Unterverzeichnis strong strong angelegt br n print body html n Erläuterung Das Beispiel definiert eine Liste namens Verzeichnisbaum Darin werden Einträge gespeichert die eine anzulegende Unterverzeichnisstruktur darstellen Weiter unten im Beispielscript wird diese Liste in einer foreach Schleife abgearbeitet Dabei wird jedes einzelne der Verzeichnisse mit mkdir angelegt Das jeweils aktuelle Verzeichnis der Liste steht innerhalb der Schleife in Als zweiter Parameter wird die Oktalzahl 0777 übergeben Damit erhalten alle Benutzer der Verzeichnisse alle Rechte Das Beispielscript erzeugt HTML Code und gibt für jedes angelegte Verzeichnis einen entsprechenden Satz aus readlink Wert einer Link Datei auslesen Liest den Wert einer symbolischen Link Datei aus Das sind Link Dateien die z B mit Hilfe von symlink erzeugt wurden Erwartet als Parameter 1 den Namen der symbolischen Link Datei wenn nötig mit Pfadnamen Es ist auch möglich keinen Parameter zu übergeben In diesem Fall wird der Inhalt der vordefinierten Variablen verwendet Gibt den vollständigen Pfad der Datei aus auf die sich die Link Datei bezieht Im Fehlerfall gibt die Funktion undef zurück und schreibt den Fehlertext in die vordefinierte Variable Auf Betriebssystemen die keine symbolischen Links kennen also z B unter Windows produziert der Aufruf dieser Funktion einen schweren Fehler Beispiel eines vollständigen CGI Scripts in Perl usr bin perl use strict use CGI Carp qw fatalsToBrowser chdir tmp symlink usr local webdocs index htm webindex sym my Inhalt readlink webindex sym print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n print Inhalt der symbolischen Datei Inhalt n print body html n Erläuterung Das Beispielscript wechselt zunächst mit chdir ins Verzeichnis tmp Dort legt es mit symlink eine symbolische Link Datei namens webindex sym an die ein symbolischer Link zu der Datei usr local webdocs index htm ist Mit readlink wird anschließend der Wert ausgelesen der der symbolischen Datei zugeordnet ist Zur Kontrolle erzeugt das Beispielscript HTML Code Dabei wird der webindex sym zugeordnete Pfadnamen zur verlinkten Datei ausgegeben rename Datei Verzeichnis umbenennen Erwartet als Parameter 1 den Namen der umzubenennenden Datei oder des umzubenennenden Verzeichnisses wenn nötig mit Pfadnamen 2 den neuen Namen der Datei oder des Verzeichnisses wenn nötig mit neuem Pfadnamen Wenn der erste Parameter eine Datei ist und der zweite Parameter der Name eines anderen Verzeichnisses wird die Datei in das andere Verzeichnis verschoben Es ist jedoch mit dieser Funktion nicht möglich als ersten und zweiten Parameter zwei unterschiedliche Verzeichnisse anzugeben um das erste Verzeichnis in das zweite zu verschieben Es ist außerdem nicht möglich Dateien auf eine andere Partition zu verschieben Abhilfe schafft hierbei die Funktion move aus dem Standardmodul File Copy Gibt true zurück wenn die Operation erfolgreich war ansonsten false Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser chdir htmldocs opendir DIR my Eintraege readdir DIR closedir DIR print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n my Eintrag my Name my NeuerEintrag foreach Eintrag Eintraege if Eintrag htm Name 1 NeuerEintrag Name html rename Eintrag NeuerEintrag print Eintrag in NeuerEintrag umbenannt br n print body html n Erläuterung Das Beispiel bewirkt dass alle Dateien eines Verzeichnisses die auf die Endung htm enden in gleichnamige Dateien mit der Endung html umbenannt werden Das Script wechselt zunächst mit chdir in das Verzeichnis htmldocs Anschließend liest es dieses aktuelle Verzeichnis in die Liste Eintraege ein Erläuterungen zu diesen Befehlen siehe opendir Das Beispielscript erstellt HTML Code Dabei werden die Einträge des eingelesenen Verzeichnisses in einer foreach Schleife abgearbeitet Bei jedem Eintrag wird geprüft ob es sich um eine Datei mit der Endung htm handelt Wenn ja wird der Vorname der Datei in Name gespeichert und ein neuer Dateiname aus dem Wert von Name und der Endung html definiert Anschließend wird die Funktion rename aufgerufen Dabei wird der bisherige Eintrag also eine Datei htm in den neuen Eintrag also eine Datei mit gleichem Vornamen nur mit der Endung html umbenannt Zur Kontrolle listet das Script alle Umbenennungen auf rmdir Verzeichnis löschen Erwartet als Parameter 1 den Namen des zu löschenden Verzeichnisses wenn nötig den Pfadnamen Das Verzeichnis muss leer sein andernfalls kann es mit dieser Funktion nicht gelöscht werden Nicht leere Verzeichnisse lassen sich mit der Funktion rmtree aus dem Standardmodul File Path löschen Gibt 1 zurück wenn das Verzeichnis gelöscht wurde Falls ein Fehler aufgetreten ist wird 0 zurückgegeben und in der vordefinierten Variablen steht die Fehlermeldung Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser my Verzeichnis ENV QUERY STRING my Ergebnis rmdir Verzeichnis print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n if Ergebnis 1 print Verzeichnis gel ouml scht else print print body html n Erläuterung Das Script erwartet einen Übergabeparameter der beim Aufruf über einen URI hinter einem Fragezeichen notiert wird Der Übergabeparameter besteht in der Pfadangabe des zu löschenden Verzeichnisses Beispiel mydocs texte schrott Das Script versucht das übergebene Verzeichnis zu löschen Der Rückgabewert des Versuchs wird in dem Skalar Ergebnis gespeichert Anschließend erzeugt das Script HTML Code Dabei wird ausgegeben ob das übergebene Verzeichnis erfolgreich gelöscht wurde oder nicht Wenn nicht wird die erzeugte Fehlermeldung ausgegeben stat Eigenschaften einer Datei ermitteln Ermittelt diverse Eigenschaften einer Datei auf einmal in Listenform Die meisten dieser Eigenschaften sind Unix spezifisch Einige Eigenschaften lassen sich zwar

    Original URL path: http://html.ekiwi.de/perl/funktionen/dateiverwaltung.htm (2016-04-25)
    Open archived version from archive

  • SELFHTML: Perl / Perl-Sprachelemente / Reguläre Ausdrücke
    vorkommen Nr Regulärer Ausdruck Beispiel passt auf eine Zeichenkette die mindestens 1 a ein a enthält 2 ab ein a oder ein b enthält 3 A Z einen Großbuchstaben enthält passt nicht auf Umlaute 4 0 9 eine Ziffer enthält 5 d eine Ziffer enthält genau wie 4 6 D ein Zeichen enthält das keine Ziffer ist 7 d eine Ziffer oder ein Minuszeichen enthält 8 eine eckige Klammer enthält 9 a zA Z0 9 eins der Zeichen vom Typ Buchstabe ohne Umlaute vom Typ Ziffer oder einen Unterstrich enthält 10 w eins der Zeichen vom Typ Buchstabe vom Typ Ziffer oder einen Unterstrich enthält fast genau wie 9 ob Umlaute erkannt werden können hängt von der Systemkonfiguration ab 11 W ein Zeichen enthält was weder Buchstabe noch Ziffer noch Unterstrich ist ob Umlaute ausgeschlossen werden können hängt von der Systemkonfiguration ab 12 r ein Steuerzeichen für den Wagenrücklauf enthält 13 n ein Steuerzeichen für den Zeilenvorschub enthält 14 t ein Steuerzeichen für den Tabulator enthält 15 f ein Steuerzeichen für den Seitenvorschub enthält 16 s ein Leerzeichen oder ein Steuerzeichen aus 12 15 enthält 17 S ein Zeichen enthält das kein Leerzeichen oder Steuerzeichen aus 12 15 ist 18 äöüÄÖÜ ein Zeichen enthält was kein deutscher Umlaut in der entsprechenden Zeichenkodierung ist 19 a zA Z ein Zeichen enthält welches kein Buchstabe ist ohne Umlaute Wenn Sie mit einem regulären Ausdruck prüfen wollen ob in einer Zeichenkette ein bestimmtes Zeichen vorkommt genügt es dieses Zeichen innerhalb der Begrenzer hier der Schrägstriche zu notieren so wie in den Beispielen 1 und 12 15 Wenn das gesuchte Zeichen innerhalb von regulären Ausdrücken ein reserviertes Zeichen ist wie beispielsweise ein müssen Sie es mit einem umgekehrten Schrägstrich maskieren Reservierte Zeichen sind auf jeden Fall Wenn Sie allerdings wirklich nur das Vorkommen eines festen Zeichens oder einer festen Zeichenkette überprüfen wollen ist die Funktion index die bessere Wahl Für reguläre Ausdrücke interessanter sind Fälle in denen Sie prüfen wollen ob ein Zeichen vorkommt das auf verschiedene Möglichkeiten passen soll oder explizit nicht passen soll wie in den Beispielen 2 11 und 16 19 Dafür gibt es innerhalb der regulären Ausdrücke die so genannten Zeichenklassen Eine Zeichenklasse wird grundsätzlich innerhalb eckiger Klammern notiert wie in den Beispielen 2 4 7 9 und 18 19 Eine Zeichenklasse passt immer genau auf ein Zeichen Innerhalb dieser Zeichenklasse können Sie nun die verschiedenen Zeichen dieser Klasse aufzählen indem Sie die Zeichen nacheinander notieren Reservierte Zeichen müssen auch hierbei explizit mit einem umgekehrten Schrägstrich maskiert werden wie in Beispiel 8 Wenn Sie einen größeren Zeichenbereich haben der passen soll können Sie diesen angeben indem Sie das erste Zeichen des Bereichs notieren danach ein Minuszeichen als Bindestrich und danach das letzte Zeichen des Bereichs wie in den Beispielen 3 4 9 und 19 Wenn Sie den Bindestrich als wirkliches Zeichen meinen notieren Sie ihn am Anfang der Zeichenklasse wie in Beispiel 7 Für bestimmte häufig vorkommende Zeichenklassen gibt es Abkürzungen So entspricht 0 9 d und r n t f entspricht s a zA Z0 9 entspricht im allgemeinen der Abkürzung w Sie können diese Abkürzungen auch innerhalb von Zeichenklassen verwenden wie in Beispiel 7 Sie können Zeichenklassen negieren um festzulegen dass sie auf ein bestimmtes Zeichen nicht passen sollen wie in den Beispielen 18 und 19 Dazu notieren Sie direkt nach der öffnenden eckigen Klammer das Hütchensymbol Beachten Sie dass auch dann mindestens ein Zeichen in der durchsuchten Zeichenkette vorhanden sein muss auf das der reguläre Ausdruck nicht passt obwohl kein Buchstabe in der Zeichenkette vorkommt Wenn Sie also Beispiel 19 auf eine leere Zeichenkette anwenden bekommen Sie als Ergebnis dass der reguläre Ausdruck nicht passt Um abgekürzte Zeichenklassen wie etwa s oder d zu negieren ändern Sie einfach den Namen der Abkürzung in einen Großbuchstaben also S oder D Reguläre Ausdrücke für Zeichenketten Sie können nach einer bestimmten Zeichenkette suchen nach einer Zeichenkette mit Gruppierungsoperatoren Platzhalter Wildcards suchen nach Zeichenketten am Anfang oder Ende eines Wortes suchen nach Zeichenketten am Anfang oder Ende einer Zeile suchen Diese Art von regulären Ausdrücken ist dazu gedacht um etwa in einem Wert nach dem Vorkommen eines bestimmten Wortes einer beliebigen Teilzeichenkette oder nach einem Muster zu suchen Nr Regulärer Ausdruck Beispiel Wirkung 1 aus passt auf aus auch in Haus oder Mausi 2 aus passt auf aus usw aber auch au und auf 3 a passt auf ab und an ein beliebiges Zeichen hinter a außer n 4 a passt auf a und aa und aaaaa ein oder beliebig viele a 5 a passt auf a und aa und aaaaa und b kein oder beliebig viele a 6 Ha s passt auf Haus und Hans aber nicht Hannes 7 Ha s passt auf Haus und Hans und Hannes ein oder beliebig viele beliebige Zeichen außer n 8 Ha s passt auf Haus und Hans und Hannes kein oder beliebig viele beliebige Zeichen außer n 9 Ha s passt auf Haus und Hans und Hase 10 x 10 20 passt auf zwischen 10 und 20 x in Folge 11 x 10 passt auf 10 und mehr x in Folge 12 x 2 y passt auf xxxy oder xaby usw zwei beliebige Zeichen zwischen x und y außer n 13 Hans b passt auf Hans aber nicht Hansel Wortgrenze 14 baus passt auf aus oder außen aber nicht Haus Wortgrenze 15 baus b passt auf aus aber nicht Haus und auch nicht außen Wortgrenze 16 baus B passt auf außen aber nicht aus und auch nicht Haus Wortgrenze und negative Wortgrenze 17 Hans passt auf Hans nur am Anfang des zu durchsuchenden Bereichs 18 Hans passt auf Hans nur am Ende des zu durchsuchenden Bereichs 19 s passt auf Zeilen die nur aus Leerzeichen und anderen Leerraumzeichen bestehen oder leer sind 20 Name interpretiert den Inhalt des Skalars Name als regulären Ausdruck Wenn Sie in einem regulären Ausdruck nach einer bestimmten Zeichenkette suchen wollen notieren Sie die Zeichenkette einfach zwischen den beiden Schrägstrichen des regulären Ausdrucks so wie in Beispiel 1 Allerdings gilt auch hier wie bei den regulären Ausdrücken für einzelne Zeichen wenn Sie nach einer festen Zeichenfolge suchen sind Sie mit der Funktion index besser beraten Reguläre Ausdrücke sind sozusagen eine eigene Sprache die durch Wörter die anhand grammatischer Regeln verknüpft werden dargestellt wird Die Verknüpfung erfolgt durch Operatoren Der Grund warum reguläre Ausdrücke so kompliziert erscheinen ist die hohe Komprimierung in der Notation Ein Wort in der Sprache der regulären Ausdrücke wird Atom genannt Atome stellen immer genau ein gesuchtes Zeichen dar beispielsweise a abc oder Die Zeichenklasse abc stellt ein Zeichen dar das a b oder c sein kann Der Punkt ist die Abkürzung für eine ganz spezielle Zeichenklasse die alle Zeichen außer dem Zeilenumbruch beinhaltet Er entspricht also in der DOS Eingabeaufforderung beispielsweise dem Das Konstrukt stellt eine eckige Klammer dar die aber durch den umgekehrten Schrägstrich maskiert werden muss wenn sie nicht als Steuerzeichen verstanden werden soll Um aus Atomen ein zusammenhängendes Muster zu bilden notieren Sie die Atome einfach ohne Leerzeichen aneinander Zeichenwiederholungen können Sie mit Wiederholungsoperatoren kennzeichnen Das Fragezeichen bedeutet in einem regulären Ausdruck das Zeichen vor dem Fragezeichen oder auch nicht Siehe dazu Beispiel 2 Das Pluszeichen bedeutet eine oder mehrere Wiederholungen des Zeichens das vor dem Pluszeichen steht Siehe dazu Beispiel 4 Das Sternzeichen bedeutet keine eine oder mehrere Wiederholungen des Zeichens das vor dem Sternzeichen steht Siehe dazu Beispiel 5 Wenn Sie vor den Zeichen oder einen Punkt notieren der für ein beliebiges Zeichen steht erzeugen Sie einen Platzhalter der dem in der DOS Windows Welt etwa bei Dateinamen entspricht Siehe dazu Beispiele 6 bis 9 Geschweifte Klammern mit einer Zahl oder zwei Zahlen n darin n stehen für n Wiederholungen des Zeichens vor der geschweiften Klammer an der betreffenden Stelle siehe dazu Beispiele 10 bis 12 Dabei können Sie auch das Punktzeichen vor der geschweiften Klammer notieren In diesem Fall bedeutet die Angabe innerhalb der geschweiften Klammer so viele beliebige Zeichen wie angegeben siehe dazu Beispiel 12 Sie können nach Zeichenketten suchen die nur dann gefunden werden wenn sie am Anfang oder am Ende eines Wortes vorkommen Auch die Umkehrung davon ist möglich Sie können nach Zeichenketten suchen die nur dann gefunden werden wenn sie nicht am Anfang oder am Ende eines Wortes vorkommen Mit b vor einer Zeichenkette wird die Zeichenkette nur gefunden wenn ein Wort damit anfängt Mit b nach einer Zeichenkette wird die Zeichenkette nur gefunden wenn ein Wort damit endet Mit B vor einer Zeichenkette wird die Zeichenkette nur gefunden wenn ein Wort nicht damit anfängt Mit B nach einer Zeichenkette wird die Zeichenkette nur gefunden wenn ein Wort nicht damit endet Zu diesen Möglichkeiten siehe Beispiele 13 bis 16 Genau gesagt definiert b die Grenze zwischen w und W oder Zeichenkettenanfang oder ende Sie können Zeichenketten suchen die nur dann gefunden werden wenn sie am Anfang oder am Ende einer Zeile im zu durchsuchenden Bereich vorkommen Dies ist vor allem im Zusammenhang mit Zeilen in Textdateien interessant Mit dem Hütchensymbol am Beginn des Suchausdrucks wird die Zeichenkette nur gefunden wenn sie am Anfang des Bereichs steht Mit dem Dollarzeichen am Ende des Suchausdrucks wird die Zeichenkette nur gefunden wenn sie am Ende des Bereichs steht Zu diesen Möglichkeiten siehe Beispiele 17 bis 19 Innerhalb von regulären Ausdrücken können Sie auch Variablen verwenden Auf diese Weise können Sie dynamische Daten als Suchmuster einsetzen Im Zusammenhang mit CGI können Sie z B die Anwendereingabe aus einem Formularfeld in ein Suchmuster übernehmen Siehe dazu Beispiel 20 Maskierung von Zeichen in regulären Ausdrücken Da es bei regulären Ausdrücken einige Zeichen mit Sonderbedeutung gibt müssen Sie solche Zeichen maskieren wenn Sie nicht die Sonderbedeutung des Zeichens meinen sondern seine literale normale Bedeutung also einen Senkrechtstrich als Senkrechtstrich oder einen Punkt als Punkt meinen Das Maskierungszeichen ist in allen Fällen der Backslash Zeichen Maskierung Grund Beispiel Wenn der Schrägstrich den regulären Ausdruck begrenzt muss er innerhalb davon maskiert werden usr bin perl Der Punkt steht in regulären Ausdrücken ansonsten für ein beliebiges anderes Zeichen Ende aus Das Pluszeichen steht ansonsten für ein oder mehrmaliges Vorkommen des davorstehenden Zeichens d d Das Sternzeichen steht ansonsten für kein ein oder mehrmaliges Vorkommen des davorstehenden Zeichens char Das Fragezeichen steht ansonsten für kein oder einmaliges Vorkommen des davorstehenden Zeichens Wie geht das Das Dach oder Hütchensymbol kann ansonsten eine Zeichenklasse verneinen oder bei Zeichenketten angeben dass das nachfolgende Suchmuster am Anfang des Suchbereichs vorkommen muss ein über dem Kopf Das Dollarzeichen kann einen Skalar einleiten oder bei Zeichenketten angeben dass das voranstehende Suchmuster am Ende des Suchbereichs vorkommen muss Preis US Dollar d Der Senkrechtstrich kann ansonsten alternative Ausdrücke auseinanderhalten find sort Der Backslash würde ansonsten das nachfolgende Zeichen maskieren C Runde Klammern können ansonsten Teilausdrücke gruppieren und zum Merken einklammern Hinweis Eckige Klammern begrenzen ansonsten eine Zeichenklasse d Geschweifte Klammern bedeuten ansonsten eine Wiederholungs Angabe für davorstehende Zeichen ENV Gierige und genügsame Suchmuster Normalerweise sind alle regulären Ausdrücke die Wildcard Ausdrücke wie enthalten sehr gierig Sie holen sich so viele Zeichen wie möglich Es gibt jedoch die Möglichkeit solche Ausdrücke zu mehr Genügsamkeit zu zwingen Beispiel eines vollständigen CGI Scripts in Perl Anzeigebeispiel So sieht s aus Zum Aufruf des Scripts ist eine Internet Verbindung erforderlich usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n my HTML Zeile html head title Testausgabe title head body h1 Uuml berschrift h1 body html HTML Zeile my gierig 1 HTML Zeile my genuegsam 1 gierig s lt g nur wegen HTML Ausgabe gierig s gt g nur wegen HTML Ausgabe genuegsam s lt g nur wegen HTML Ausgabe genuegsam s gt g nur wegen HTML Ausgabe print p b Gierige Version b tt gierig tt p print p b Gen uuml gsame Version b tt genuegsam tt p print body html n Erläuterung Das Beispiel Script demonstriert die Gier regulärer Ausdrücke und zeigt auch wie sich diese Gier unterbinden lässt Ein Skalar namens HTML Zeile wird deklariert und erhält als Anfangswert den Code einer kompletten kleinen HTML Datei Anschließend wird dieser Skalar mit einem regulären Ausdruck bewertet der darin nach einem Muster sucht In runde Klammern eingeschlossen ist das gesamte Suchmuster weil anschließend ausgegeben werden soll was gefunden wurde Das Suchergebnis wird im Skalar gierig gespeichert Anschließend wird die Prozedur noch einmal wiederholt Diesmal ist der reguläre Ausdruck nur minimal anders er enthält hinter dem Pluszeichen noch ein Fragezeichen Beide Suchergebnisse werden anschließend noch für die HTML Ausgabe vorbereitet und zwar werden die spitzen Klammern HTML gerecht ersetzt siehe dazu auch Suchen und Ersetzen mit regulären Ausdrücken Die Ausgabe von gierig bewirkt html head title Testausgabe title head body h1 Überschrift h1 body html Die Ausgabe von genuegsam dagegen html Der Wildcard Ausdruck der alles bis zum Zeichen holen soll macht nämlich nicht beim nächsten Stopp sondern erst beim allerletzten Durch das Anhängen des Fragezeichens also durch Erweiterung auf beschränkt sich das Muster auf das Auffinden des nächsten Zeichens Reguläre Ausdrücke mit Alternativen Sie können mehrere Suchausdrücke angeben Dann passt der Ausdruck auf alle Zeichenketten in denen wenigstens eine der Alternativen vorkommt Beispiel eines vollständigen CGI Scripts in Perl Anzeigebeispiel So sieht s aus Zum Aufruf des Scripts ist eine Internet Verbindung erforderlich usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n my Text Kaffee ohne Milch print egal ob mit oder ohne br n if Text mit ohne Text Kaffee mit Milch print sag ich doch egal ob mit oder ohne br n if Text mit ohne print body html n Erläuterung Das Beispiel Script deklariert einen Skalar Text mit dem Anfangswert Kaffee ohne Milch Abhängig vom Erfolg des regulären Ausdrucks mit ohne der auf diesen Skalar angewendet wird wird im aufrufenden Browser ausgegeben egal ob mit oder ohne Der Senkrechtstrich teilt den regulären Ausdruck in zwei Alternativen auf bei denen es reicht wenn eine davon zutrifft Da dies der Fall ist wird der Satz im Browser ausgegeben Zur Kontrolle wird der Text anschließend zu Kaffee mit Milch geändert Der anschließend angewendete gleiche reguläre Ausdruck führt wieder zum Erfolg und es wird sag ich doch egal ob mit oder ohne ausgegeben Teilausdrücke merken mit Klammerung Mit Hilfe von Klammerung einzelner Teile eines regulären Ausdrucks können Sie Teilmuster speichern und an einer späteren Stelle wiederverwenden Beispiel eines vollständigen CGI Scripts in Perl Anzeigebeispiel So sieht s aus Zum Aufruf des Scripts ist eine Internet Verbindung erforderlich usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n my CTIME localtime time CTIME A Za z s A Za z s d s d d d s d my Tag 1 my Monat 2 my Monatstag 3 my Stunden 4 my Minuten 5 my Sekunden 6 my Jahr 7 my Tage Mon Montag Tue Dienstag Wed Mittwoch Thu Donnerstag Fri Freitag Sat Samstag Sun Sonntag my Monate Jan 01 Feb 02 Mar 03 Apr 04 May 05 Jun 06 Jul 07 Aug 08 Sep 09 Oct 10 Nov 11 Dec 12 print b Heute ist Tage Tag der Monatstag Monate Monat Jahr es ist Stunden Minuten Uhr b n print body html n Erläuterung Das Beispiel ruft die Perl Funktion localtime mit dem Rückgabewert der Funktion time auf und speichert den Rückgabewert von localtime im Skalar CTIME Darin ist anschließend eine Zeichenkette gespeichert die so aufgebaut ist Sun Jun 17 21 37 40 2006 In der darauffolgenden Anweisung wird CTIME mit einem langen regulären Suchausdruck bewertet Der reguläre Ausdruck versucht das gesamte typische Muster des Datum Uhrzeit Strings zu erfassen Die Nutzdaten darin also Wochentag Monatsname Monatstag Stunden Minuten Sekunden und Jahr werden innerhalb des regulären Ausdrucks geklammert Jeden Inhalt dieser Klammern merkt sich Perl und stellt ihn in den vordefinierten Variablen 1 2 3 usw zur Verfügung Die anschließend deklarierten Skalare holen sich die Werte aus den Klammern indem ihnen die entsprechenden vordefinierten Variablen zugewiesen werden Die beiden Hashes Tage und Monate werden zum Zweck eines deutschsprachigen Datum Uhrzeit Formats verwendet Das Script gibt am Ende so etwas aus wie Heute ist Sonntag der 18 02 2007 es ist 17 39 Uhr Rangfolge in regulären Ausdrücken Die Sonderzeichen innerhalb von regulären Ausdrücken werden vom Perl Interpreter nach einer bestimmten Rangfolge bewertet Rangstufe Klammerung Rangstufe Wiederholungsoperatoren Rangstufe abc b B Zeichen Zeichenketten Zeilenanfang ende Wortanfang ende Rangstufe Alternativen Dadurch ist jeder reguläre Ausdruck eindeutig bewertbar Wenn Sie in einem Ausdruck jedoch anders bewerten möchten als es nach der Rangfolge geschieht können Sie innerhalb des Ausdrucks Klammern setzen um eine andere Bewertung zu erzwingen Beispiele a bc d findet a oder bc oder d a b c d findet ac oder ad oder bc oder bd Erläuterung Laut der Rangfolge haben Zeichen bzw Zeichenketten Vorrang vor dem Trennzeichen für Alternativen Mit Hilfe von Klammern können Sie eine andere Bewertung erzwingen siehe Beispiel Wenn Sie die Klammern zur Bewertungsänderung benutzen möchten ohne sich die entsprechenden Teilausdrücke merken zu wollen können Sie auch Klammern benutzen die nur gruppieren Dabei wird direkt hinter der öffnenden Klammer die Zeichenfolge notiert im Beispiel wäre das a b c d Flags hinter regulären Ausdrücken Hinter dem beendenden Begrenzerzeichen normalerweise Schrägstrich eines regulären Ausdrucks können noch ein oder mehrere Buchstaben notiert werden so genannte Flags Damit können Sie das Verhalten der Suche zusätzlich beeinflussen Mit einer Notation wie aus g suchen Sie beispielsweise global nach dem Vorkommen von aus und mit aus gim suchen Sie die Zeichenfolge aus global egal ob groß oder klein geschrieben und die Zeichenkette kann auch aus mehreren Zeilen bestehen Flags können Sie also beliebig kombinieren Die folgende Tabelle listet die möglichen Flags auf Flag Bedeutung c

    Original URL path: http://html.ekiwi.de/perl/sprache/regexpr.htm (2016-04-25)
    Open archived version from archive

  • SELFHTML: Perl / Perl-Sprachelemente / Listen bzw. Arrays (Variablen)
    0 zeigt mit dem voranstehenden Dollarzeichen dass der Zugriff auf das Array Element einen Skalar anfordert denn Skalare sind immer an dem voranstehenden Dollarzeichen erkennbar Beachten Sie Wenn Sie einen Array namens Daten haben können Sie mit der speziellen Notation Daten die höchste Indexnummer ermitteln also die des letzten Listenelements ohne zu wissen wie viele Elemente die Liste hat Angenommen die Liste Daten hat 15 Elemente dann würde Daten den Wert 14 liefern Mit einer Notation wie Daten Daten können Sie dann den Wert des letzten Listenelements von Daten ermitteln Indem Sie negative Indexnummern verwenden können Sie auf die Elemente am Ende des Arrays zugreifen Dabei ist Daten 1 das letzte Element Daten 2 das vorletzte usw Mehrdimensionale Arrays Wenn Sie andere Programmiersprachen kennen sind Ihnen vielleicht schon mehrdimensionale Arrays begegnet Dies sind Arrays die Daten in matrixartiger Form speichern Am einfachsten vorstellbar ist der zweidimensionale Array Die darin gespeicherten Werte können Sie sich als Tabelle vorstellen Um ein bestimmtes Element davon anzusprechen geht man in eine bestimmte Tabellenzeile und von dort aus in eine bestimmte Spalte Perl kennt mehrdimensionale Arrays in diesem Sinne nicht sondern nur Listen die selbst wieder Referenzen auf Listen enthalten können Dabei sind beliebig tiefe Verschachtelungen erlaubt Stellen Sie sich jede Unterliste einer Liste als eine Dimension vor Beispiel eines vollständigen CGI Scripts Anzeigebeispiel So sieht s aus Zum Aufruf des Scripts ist eine Internet Verbindung erforderlich usr bin perl w use strict use CGI Carp qw fatalsToBrowser my Liste 1 Baumholder Bernried Butzbach my Liste 2 Berlin Bremen Liste 1 my Liste 3 Berlin Bremen Liste 1 print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n print b Liste 2 b pre Liste 2 pre n print b Liste 2 4 b pre Liste 2 4 pre n print b Liste 3 b pre Liste 3 pre print b Liste 3 2 1 b pre Liste 3 2 1 pre n print body html n Erläuterung Im Beispiel werden insgesamt drei Listen deklariert und mit Anfangswerten initialisiert Besonders interessant sind dabei die Listen Liste 2 und Liste 3 Beide erhalten als jeweils letztes Element die komplette Liste Liste 1 zugewiesen dabei zu beachten der Array Name darf nicht in Anführungszeichen stehen Die Syntax ist dabei nur ganz leicht verschieden in der Zuweisung bei Liste 2 ist einfach Liste 1 notiert während in der Zuweisung bei Liste 3 noch eckige Klammern hinzukommen Dort ist Liste 1 notiert Dieser kleine Unterschied hat Folgen während nämlich bei Liste 2 die Einzelwerte von Liste 1 einfach hinzugefügt werden wird durch die eckigen Klammern bei Liste 3 eine neue Unterliste eröffnet Das Beispiel sendet HTML Code an den aufrufenden Browser in dem der Unterschied deutlich wird Liste 2 besteht nun einfach aus fünf Elementen nämlich Berlin Bremen Baumholder Bernried Butzbach Eine Notation wie Liste 2 4 greift auf das fünfte Element also den Wert Butzbach zu Liste 3

    Original URL path: http://html.ekiwi.de/perl/sprache/listen.htm (2016-04-25)
    Open archived version from archive

  • SELFHTML: Perl / Perl-Sprachelemente / Zeichenketten (Strings)
    einfachen Anführungszeichen das abschließend notierte Steuerzeichen n ebenfalls so ausgegeben wie es als Zeichenfolge da steht während das Steuerzeichen bei Verwendung doppelter Anführungszeichen interpretiert wird also im ausgegebenen Text tatsächlich einen Zeilenumbruch erzeugt Das bedeutet also verwenden Sie doppelte Anführungszeichen wenn in einer Zeichenkette angegebene Variablen und Steuerzeichen interpretiert werden sollen und verwenden Sie einfache Anführungszeichen wenn genau das nicht geschehen soll Die beiden Operatoren qq und q entsprechen den doppelten bzw einfachen Anführungszeichen Bei qq werden Variablen und Steuerzeichen interpretiert bei q dagegen nicht Die Verwendung von qq und q ist nicht so gebräuchlich wie diejenige mit Anführungszeichen doch sie kann Quelltext durchaus lesbarer machen Im obigen Beispiel wurden runde Klammern gewählt um den Inhalt von qq und q einzuschließen Sie können jedoch auch andere Zeichen dazu verwenden Bei Zeichen die ein Gegenstück besitzen etwa und und oder und wird dieses als Endbegrenzer erwartet Perl achtet dann auf Verschachtelungen innerhalb der Zeichenkette Derartige Klammern eignen sich somit hervorragend dafür um beispielsweise Perl Code innerhalb einer Zeichenkette darzustellen Wenn Sie andere Zeichen als Begrenzer verwenden achten Sie darauf dass das Zeichen in der Zeichenkette nicht vorkommt Neben diesen Formen gibt es auch noch qx oder als Alternative dazu die so genannten Backticks Damit erzeugen Sie Zeichenketten die von Perl als Systemaufruf umgesetzt werden Einzelheiten dazu im Abschnitt qx Andere Programme Scripts ausführen und STDOUT auffangen Steuerzeichen in Zeichenketten Für die Notation einiger wichtiger Steuerzeichen stellt Perl eine spezielle Notationssyntax zur Verfügung die sich an die Sprache C anlehnt Solche Zeichen werden durch einen Backslash eingeleitet Dahinter folgt ein Buchstabe der das Steuerzeichen bezeichnet Diese Steuerzeichen werden nur innerhalb von Zeichenketten interpretiert die in doppelten Anführungszeichen oder in qq stehen und auch nur dann wenn der Ausgabekanal entsprechende Möglichkeiten bietet Folgende Steuerzeichen gibt es Notation Bedeutung Beispiel a Alarmton Beep print a b Backspace Zeichen print meine b e Escape Zeichen zur Einleitung von Escape Sequenzen print e A f Steuerzeichen für Seitenvorschub print Seitenende fSeitenanfang n Steuerzeichen für Zeilenvorschub Der genaue Zeichencode dafür ist betriebssystemabhängig Unter Unix ist es beispielsweise der ASCII Code 10 während es auf Apple Macintosh der ASCII Code 13 und unter DOS eine Zeichenfolge aus ASCII 13 und 10 ist print Zeilenende nZeilenanfang r Steuerzeichen für Wagenrücklauf Der genaue Zeichencode dafür ist betriebssystemabhängig Unter Unix und DOS ist es beispielsweise der ASCII Code 13 während es auf Apple Macintosh der ASCII Code 10 ist print Wagen rWagenrücklauf t Steuerzeichen für Tabulator print Alter t32 Maskierung von Zeichen in Zeichenketten Jene Zeichen die eine Zeichenkette einschließen müssen Sie falls das entsprechende Zeichen innerhalb der Zeichenkette vorkommt maskieren Dazu wird der Backslash als Maskierungszeichen verwendet Da nun dadurch auch der Backslash besondere Bedeutung erhält muss er selber ebenfalls maskiert werden falls er in einer Zeichenkette als Zeichen vorkommt Beispiel eines vollständigen CGI Scripts in Perl Anzeigebeispiel So sieht s aus Zum Aufruf des Scripts ist eine Internet Verbindung erforderlich usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text plain n n print

    Original URL path: http://html.ekiwi.de/perl/sprache/zeichenketten.htm (2016-04-25)
    Open archived version from archive

  • SELFHTML: Perl / Perl-Sprachelemente / Tokens
    steht für das logische Ende eines Scripts oder Moduls es kann danach jedoch noch Text und anderes folgen DATA allein in einer Zeile steht auch für das logische Ende eines Scripts oder Moduls PACKAGE steht für den Namen des aktuellen Namensraums Hinter den Tokens END und DATA kann z B Text notiert werden der aber nicht mehr als Quellcode des Scripts interpretiert wird Diese Technik wird bei Modulen gerne benutzt um die Dokumentation zum Modul Code direkt im Modul zu notieren ohne den Perl Parser damit aufzuhalten die im Code stehende Dokumentation als solche erkennen zu müssen Der in Modulen hinter DATA und im Hauptscript hinter DATA oder END stehende Text kann mit dem speziellen Dateihandle DATA vom Programm eingelesen werden Beispiel usr bin perl w Hier folgt der normale Code des Modul Scripts END head1 NAME MyModul Irgendwas tut dies und das head1 SYNOPSIS require MyAnderesModul my Objekt new MyModul Irgendwas my Objekt Methode Objekt Parameter head1 DESCRIPTION Das Modul tut irgendwas head1 AUTHOR Fridolin Froetzel froetzel example org cut Erläuterung Das Beispiel zeigt was typischerweise hinter dem Token END notiert wird Dort folgt eine Dokumentation und das Impressum zum Script oder zum Modul Für diese Art von Dokumentation

    Original URL path: http://html.ekiwi.de/perl/sprache/tokens.htm (2016-04-25)
    Open archived version from archive

  • SELFHTML: Perl / Funktionsreferenz / Funktionen für Berechnungen
    Nachkommateil zu trennen Andererseits kann sie auch auf Zeichenketten angewendet werden Dann interpretiert sie die Zeichenkette so lange bis sie auf ein Zeichen stößt das nicht mehr numerisch interpretiert werden kann Erwartet als Parameter 1 eine Zahl oder Zeichenkette Liefert den als Ganzzahl interpretierbaren Teil der übergebenen Daten zurück Beispiel eines vollständigen CGI Scripts in Perl Anzeigebeispiel So sieht s aus Zum Aufruf des Scripts ist eine Internet Verbindung erforderlich usr bin perl w use strict use CGI Carp qw fatalsToBrowser my Ganzzahl 23 my Kommazahl 3 1415 my Minuszahl 3 999 my Ganzzahl Int int Ganzzahl my Kommazahl Int int Kommazahl my Minuszahl Int int Minuszahl print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n print Ganzzahl nach Anwendung von int Ganzzahl Int br n print Kommazahl nach Anwendung von int Kommazahl Int br n print Minuszahl nach Anwendung von int Minuszahl Int n print body html n Erläuterung Das Beispiel definiert verschiedene Skalare eine normale Ganzzahl eine Kommazahl und eine negative Zahl ebenfalls eine Kommazahl Daraufhin wird auf jeden der Skalare die Funktion int angewendet Die Rückgabewerte werden in eigenen neuen Skalaren gespeichert Zur Kontrolle wird HTML Code mit den Werten vor und nach Anwendung der int Funktion ausgegeben log natürlichen Logarithmus einer Zahl ermitteln Erwartet als Parameter 1 eine beliebige erlaubte Zahl Gibt den natürlichen Logarithmus der Zahl zurück Beispiel eines vollständigen CGI Scripts in Perl Anzeigebeispiel So sieht s aus Zum Aufruf des Scripts ist eine Internet Verbindung erforderlich usr bin perl w use strict use CGI Carp qw fatalsToBrowser my Eins log exp 1 print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n print Eins print body html n Erläuterung Im Beispiel wird ein Skalar Eins definiert Diesem Skalar wird das Ergebnis der Funktion log zugewiesen Die Zahl die dieser Funktion übergeben wird ist im Beispiel der Rückgabewert der Funktion exp angewendet auf die Zahl 1 Da exp die Umkehrfunktion von log ist ist das Ergebnis des verschachtelten Aufrufs beider Funktionen der Wert 1 Zur Kontrolle wird HTML Code mit dem Ergebnis ausgegeben oct Dezimalwert einer Oktalzahl ermitteln Konvertiert einen als Zeichenkette vorliegenden Oktalwert in eine entsprechende Dezimalzahl Erwartet als Parameter 1 eine Zeichenkette die einen gültigen Oktalwert darstellt also beispielsweise 755 oder 0755 Gibt den entsprechenden Dezimalwert als numerischen Wert zurück Beispiel eines vollständigen CGI Scripts in Perl Anzeigebeispiel So sieht s aus mit der Rechteangabe 755 als Übergabeparameter Zum Aufruf des Scripts ist eine Internet Verbindung erforderlich usr bin perl w use strict use CGI Carp qw fatalsToBrowser my UnixRechtOct ENV QUERY STRING my DezRecht oct UnixRechtOct print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n print Die Dezimaldarstellung der Unix Rechteangabe UnixRechtOct

    Original URL path: http://html.ekiwi.de/perl/funktionen/berechnungen.htm (2016-04-25)
    Open archived version from archive

  • SELFHTML: Perl / Funktionsreferenz / Funktionen für Betriebssystemaufrufe
    vollständigen CGI Scripts in Perl usr bin perl w use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body pre n eval local SIG ALRM sub die Alarm alarm 2 system usr bin perl c usr web myhome cgi bin freelink pl alarm 0 if and Alarm print Problem 2 Sekunden vergangen n else print Alles klar n print pre body html n Erläuterung Das Beispiel zeigt wie Sie einen kritischen Systemaufruf mit Hilfe eines Timeout Alarms behandeln können Dazu wird in dem Script zunächst ein für solche Behandlung typischer eval Block notiert Darin wird mit der typischen Anweisung local SIG ALRM sub die Alarm eine Behandlungsroutine für SIGALARM definiert Anschließend wird mit alarm 2 ein Timeout von 2 Sekunden definiert bevor der Alarm aktiv wird Mit alarm 0 wird der Alarm wieder zurückgesetzt Danach wird versucht mit system den Perl Interpreter aufzurufen und zwar so dass er ein bestimmtes Script auf die Gültigkeit seiner Syntax überprüft Sollte dieser Vorgang mehr als 2 Sekunden dauern wird der Alarm aktiv Mit der Abfrage if and Alarm wird überprüft ob der Alarm aktiv wurde Wenn ja wird eine entsprechende Meldung ausgegeben Im else Zweig kann der Code stehen der ausgeführt wird wenn alles in Ordnung war Im Beispiel wird einfach ebenfalls eine entsprechende Meldung ausgegeben Beachten Sie Aufrufe mit system oder qx in Verbindung mit alarm können zu sogenannten Zombies führen Möglicherweise müssen Sie sie für solche Zwecke mit Hilfe von fork und exec selbst implementieren exec Fremdprogramm aufrufen und eigenen Prozess beenden Startet einen anderen Prozess und beendet das aktuelle Script Der aktuelle Prozess wird dabei durch den neuen Prozess vollständig ersetzt Wenn Sie das aktuelle Script nicht beenden wollen benutzen Sie system qx oder open mit dem Pipe Zeichen Erwartet als Parameter 1 Kommandozeilenaufruf des gewünschten Programms 2 bis n optional Liste mit Aufrufparametern Beispiel usr bin perl w exec usr bin perl mystats pl if e mystats pl Erläuterung Das Beispiel fragt mit Hilfe des Dateitestoperators e ab ob eine Datei namens mystats pl im aktuellen Verzeichnis existiert Wenn ja wird der Perl Interpreter in einem eigenen neuen Prozess gestartet und führt mystats pl aus fork Kindprozess erzeugen Unix spezifischer Befehl Erzeugt eine Kopie des aktuellen Prozesses die dem aktuellen erzeugenden Prozess untergeordnet ist Ein Perl Script kann sich auf diese Weise gabeln engl fork und Daten in zwei getrennten Prozessen verarbeiten Auf geöffnete Dateien können dabei beide Prozesse zugreifen Alles übrige wie Variablen usw wird vom Elternprozess in den Kindprozess kopiert Die Variable die den Rückgabewert von fork speichert hat jedoch im Elternprozess einen Wert nämlich die Prozessnummer des Kindprozesses während sie im Kindprozess den Wert 0 hat Obwohl fork eigentlich aus der Unix Welt stammt lässt sich diese Funktion mittlerweile auch unter ActivePerl für Windows nutzen Erwartet keine Parameter Gibt die vom Betriebssystem zugewiesene Prozessnummer des Kindprozesses zurück Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser 1 print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n my Eltern pid my Kind pid fork if Kind pid print p Hier ist der Elternprozess Der Kindprozess hat die PID strong Kind pid strong p n wait else my Eltern pid getppid print p Hier ist der Kindprozess Der Elternprozess hat die PID strong Eltern pid strong p n exit 0 print body html n Erläuterung Das Beispiel erzeugt mit fork einen Kindprozess Der Rückgabewert der Funktion die Prozessnummer des Kindprozesses wird in dem Skalar Kind pid gespeichert Im Beispiel ist daraufhin eine if Abfrage notiert Mit if Kind pid wird abgefragt ob der Skalar Kind pid einen Wert ungleich 0 hat Ist das der Fall werden Anweisungen ausgeführt die zum Elternprozess gehören Im Beispiel wird eine Meldung ausgegeben dass sich das Script im Elternprozess befindet Außerdem wird die Prozessnummer des Kindprozesses ausgegeben Danach wird mit der Anweisung wait gewartet bis der Kindprozess beendet ist Im else Zweig in den das Script gelangt wenn Kind pid den Wert 0 hat wird dagegen ausgegeben dass der Kindprozess aktiv ist Außerdem wird die Prozessnummer des Elternprozesses ausgegeben Danach wird der Kindprozess mit der Anweisung exit 0 beendet Der Elternprozess der darauf nur gewartet hat gibt dann noch die letzte Zeile HTML Code aus Das besondere Verhalten des Scripts das in zwei Prozessen läuft zeigt sich im Beispiel darin dass sowohl der if Zweig als auch der else Zweig ausgeführt werden Das erklärt sich daraus dass die if Bedingung für den Elternprozess wahr ist die else Alternative dagegen für den Kindprozess getpgrp Prozessgruppe einer Prozessnummer pid ermitteln Unix spezifischer Befehl Erwartet als Parameter 1 eine Prozessnummer zu der die zugehörige Prozessgruppe ermittelt werden soll Um die Prozessgruppe des aktuellen Prozesses zu ermitteln müssen Sie 0 übergeben Gibt die Gruppennummer zurück Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n my Gruppennummer getpgrp 0 print Die Prozessgruppe des aktuellen Prozesses ist strong Gruppennummer strong n print body html n Erläuterung Das Beispiel ermittelt die Gruppennummer des aktuellen Prozesses mit getpgrp und gibt HTML Code mit der ermittelten Nummer aus getppid Prozessnummer pid des Elternprozesses ermitteln Unix spezifischer Befehl Erwartet keine Parameter Gibt die Prozessnummer PID des Elternprozesses des aktuellen Scripts zurück Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n my Eltern pid getppid print Die PID des Elternprozesses lautet strong Eltern pid strong n print body html n Erläuterung Das Beispiel ermittelt die PID des Elternprozesses mit getppid und gibt HTML Code mit der ermittelten Nummer aus getpriority Text Unix spezifischer Befehl Ermittelt die aktuelle Priorität eines Prozesses einer Prozessgruppe oder eines Benutzers Prozesse mit höherer Priorität erhalten unter den aktuell laufenden Prozessen mehr Systemressourcen zur Ausführung Erwartet als Parameter 1 eine Angabe dazu ob Sie die Priorität für einen bestimmten Prozess eine Prozessgruppe oder einen Benutzer ermitteln wollen Dazu übergeben Sie am besten eine der Konstanten die in resource ph definiert sind siehe unten 2 die Nummer des Prozesses der Prozessgruppe oder des Benutzers Gibt die Priorität des Prozesses der Prozessgruppe oder des Benutzers als Zahl zurück Der mögliche Wertebereich ist abhängig vom System Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n require resource ph my Prio getpriority PRIO PROCESS 0 print Prioritaet des aktuellen Prozesses Prio n print body html n Erläuterung Das Beispiel ermittelt mit getpriority die Priorität des aktuellen Prozesses und gibt diese aus Dazu wird mit require resource ph die Kopfdatei eingebunden die die Definition der folgenden Konstanten enthält Konstante Bedeutung PRIO PROCESS Die Priorität eines bestimmten Prozesses ermitteln dessen Prozessnummer oder 0 für den aktuellen Prozess im zweiten Parameter von getpriority angegeben wird PRIO PGRP Die Priorität einer Prozessgruppe ermitteln deren Nummer oder 0 für die aktuelle Prozessgruppe im zweiten Parameter angegeben wird PRIO USER Die Priorität eines Benutzers ermitteln dessen Benutzernummer UID oder 0 für den aktuelle Benutzer im zweiten Parameter angegeben wird Durch Voranstellen eines Zeichens können Sie eine der Konstanten wie im Beispiel gezeigt als ersten Parameter übergeben Beachten Sie Diese Funktion führt zu einem schweren Fehler wenn das System keine Prozess bzw Benutzerverwaltung im Sinne von Unix kennt kill Signal an Prozess senden Unix spezifischer Befehl Damit können Sie aus einem Perl Script heraus Signale an andere laufende Prozesse auf dem Rechner senden und diese dadurch beeinflussen Interessant ist dies vor allem wenn Sie in Ihrem Perl Script eigene Kindprozesse erzeugen siehe fork Eltern und Kindprozess können dann durch Signale kommunizieren Erwartet als Parameter 1 Nummer oder Name einer Konstante siehe Tabelle weiter unten des gewünschten Signals oder Sie übergeben 0 um herauszufinden ob der Prozess mit der nachfolgend übergebenen Prozessnummer noch am Leben ist 2 bis n einer oder mehrere Prozesse an die das Signal gesendet werden soll Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser 1 print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n my Kind pid fork if kill 0 Kind pid print p Hier meldet sich ein Prozess p n kill KILL Kind pid print body html n Erläuterung Das Beispiel erzeugt mit fork einen Kindprozess Mit if kill 0 Kind pid wird abgefragt ob dieser Prozess am Leben ist Wenn ja wird ausgegeben dass sich ein Prozess meldet Da im Beispiel für den Kindprozess kein eigener Perl Code notiert ist und Kindprozesse einfach erst mal alles vom Elternprozess kopieren würden beide Prozesse sich melden und Hier meldet sich ein Prozess ausgeben Doch im Beispiel wird das verhindert indem der Elternprozess den Kindprozess mit kill KILL Kind pid tötet bevor dieser die Anweisung mit der Ausgabe der Meldung ausführen kann Die Meldung wird also insgesamt nur einmal ausgegeben Die folgende Tabelle enthält typische Signale mit Namen wie Sie sie als ersten Parameter an kill übergeben können Eine Garantie dass alle hier aufgelisteten Signale auf jedem Rechner in Perl funktionieren besteht nicht Auch die entsprechenden Nummern wurden hier weggelassen da sie von System zu System schwanken können Maßgeblich ist letztendlich immer was auf dem jeweiligen Rechner in der Datei usr include signal h definiert ist Name Bedeutung HUP Ereignis Verbindung beendet INT Ereignis allgemeine Unterbrechung QUIT Ereignis Endekennzeichen ILL Anweisung ist illegal TRAP Anweisung ist eine Falle ABRT Abbruch FPE Fehler bei Fließkommaberechnung KILL Prozess abschießen Unix kill 9 BUS Bus Übertragungsfehler SEGV Segment Schutzverletzung im Speicher PIPE Fehler bei Pipe Kommunikation ALARM Allgemeiner Alarm TERM Beendigung USR1 Benutzerdefiniert 1 USR2 Benutzerdefiniert 2 CHLD Signal vom Kindprozess PWR Stromausfall WINCH Fenstergröße wurde von einem Hintergrundprozess geändert URG Dringende Bedingung IO Asynchrone Ein Ausgabe STOP Prozess anhalten TSTP Prozess vom Terminal aus anhalten CONT Angehaltenen Prozess fortführen TTIN Prozess anhalten durch Lesen vom kontrollierenden Terminal TTOU Prozess anhalten durch Schreiben auf kontrollierendes Terminal VTALARM Virtueller Zeittaktgeber abgelaufen PROF Profil Zeittaktgeber abgelaufen XCPU CPU Belastungsgrenze erreicht XSFZ Dateigrößengrenze erreicht Beachten Sie Mit dem folgenden Script können Sie abfragen welche Signale unter welchen Signalnummern auf Ihrem Server Rechner konfiguriert sind usr bin perl use Config defined Config sig name die Kein Konfigmodul foreach name split Config sig name i printf 3d s t i name if i 5 0 print n print n pipe Pipe erzeugen Unix spezifischer Befehl Ermöglicht zwei Prozessen miteinander zu kommunizieren Eine Pipe Pfeife Röhre ist dabei der Kommunikationskanal für die beiden Prozesse Es gibt einen Kanal zum Schreiben von Daten und einen zum Lesen von Daten Für beide Kanäle gibt es jeweils ein Handle Diese Lese und Schreib Handles sind ganz ähnlich den Datei Handles Typischerweise wird eine Pipe eröffnet bevor mit fork ein Kindprozess erzeugt wird Eltern und Kindprozess können dann über die geöffnete Pipe Daten austauschen Erwartet als Parameter 1 den Namen eines Lese Handles frei vergebbar 2 den Namen eines Schreib Handles frei vergebbar Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser 1 print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body pre n pipe LESE HANDLE SCHREIB HANDLE my Kind pid fork if Kind pid close LESE HANDLE my old handle select SCHREIB HANDLE 1 for my i 1 i 5 i sleep 1 print SCHREIB HANDLE i gesendet vom Elternprozess n close SCHREIB HANDLE wait select old handle else close SCHREIB HANDLE my Speicher while defined Speicher LESE HANDLE print Empfangen Speicher n exit 0 print pre body html n Erläuterung Das Beispiel erzeugt mit pipe eine Pipe Über die beiden übergebenen Handle Namen LESE HANDLE und SCHREIB HANDLE ist anschließend der Nachrichtenaustausch zwischen zwei Prozessen möglich Mit Hilfe von fork erzeugt das Script einen Kindprozess Der Elternprozess läuft im if Zweig des nachfolgenden Codes der Kindprozess im else Zweig Beim Erzeugen des Kindprozesses wird alles kopiert außer den beiden Handles aus der Pipe Diese werden nicht kopiert bleiben allerdings für beide Prozesse verfügbar Deshalb muss jeder Prozess erst mal das nicht benötigte Handle mit close schließen Um die Pufferung der Daten abschalten zu können muss im if Zweig außerdem mit select das Schreib Handle ausgewählt werden Alle Anweisungen sowohl des if als auch des else Zweiges werden insgesamt fünf mal ausgeführt Denn in einer for Schleife die von 1 bis 5 zählt schreibt der Elternprozess nachdem er zu Testzwecken eine Sekunde lang anhält siehe sleep den aktuellen Zählerstand in das Schreib Handle Der Kindprozess im else Zweig kann diese Daten lesen indem er eine while Schleife verwendet und darin das Lese Handle ausliest Zur Kontrolle gibt der Kindprozess aus was er eingelesen hat setpgrp Prozessgruppe für Prozess bestimmen Unix spezifischer Befehl Ordnet einen Prozess einer Prozessgruppe zu Erwartet als Parameter 1 die Prozessnummer PID des gewünschten Prozesses 0 für aktuellen Prozess übergeben 2 die Nummer der Prozessgruppe der dieser Prozess zugeordnet werden soll 0 für aktuelle Prozessgruppe übergeben Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n my gruppe alt getpgrp 0 print Prozessgruppe alt strong gruppe alt strong br n setpgrp 0 0 my gruppe neu getpgrp 0 print Prozessgruppe neu strong gruppe neu strong n print body html n Erläuterung Das Beispiel ordnet den aktuellen Prozess der aktuellen Prozessgruppe zu und erzeugt so seine eigene Prozessgruppe Zum Vergleich wird die aktuelle Prozessgruppe vorher und hinterher ausgelesen und jeweils ausgegeben setpriority Priorität eines Prozesses oder Benutzers setzen Unix spezifischer Befehl Setzt die aktuelle Priorität eines Prozesses einer Prozessgruppe oder eines Benutzers Prozesse mit höherer Priorität erhalten unter den aktuell laufenden Prozessen mehr Systemressourcen zur Ausführung Da diese Funktion systemkritisch ist steht sie auf den meisten Unix Systemen nur Benutzern mit root Kennung zur Verfügung Parameter wie bei getpriority Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Testausgabe title n print head body n require resource ph my Prio getpriority PRIO PROCESS 0 Prio 1 setpriority PRIO PROCESS 0 Prio print Neue Prioritaet des aktuellen Prozesses Prio n print body html n Erläuterung Das Beispiel liest mit getpriority die Priorität des aktuellen Prozesses ein erhöht sie anschließend um 1 und setzt dann mit setpriority den neuen Wert Zur Kontrolle gibt das Script den aktuellen Wert der Priorität aus Beachten Sie Diese Funktion führt zu einem schweren Fehler wenn das System keine Prozess bzw Benutzerverwaltung im Sinne von Unix kennt sleep aktuellen Prozess anhalten Hält die Ausführung des Scripts für eine bestimmte Anzahl Sekunden an und fährt dann fort Erwartet als Parameter 1 die Anzahl Sekunden die angehalten werden soll Wenn nichts übergeben wird wird für ewig angehalten Beispiel usr bin perl w use strict sleep 10 exec usr bin perl aufwachen pl Erläuterung Das Beispiel wartet nach Aufruf von sleep 10 10 Sekunden und führt dann mit exec ein anderes Script aus system Fremdprogramm aufrufen und eigenen Prozess erhalten Ruft ein anderes Programm auf und ermittelt dessen Rückgabewert Wenn Sie daran interessiert sind welche Ausgaben das andere Programm erzeugt sollten Sie die Funktion open mit dem Zeichen oder qx bzw Backticks benutzen Erwartet als Parameter 1 eine Zeichenkette oder eine Liste Werden mehrere Parameter also eine Liste übergeben wird der erste Parameter als das auszuführende Programm bzw Kommando interpretiert und die übrigen Parameter als Übergabeparameter für das Programm bzw Kommando Gibt den Rückgabewert des ausgeführten Programms oder Kommandos zurück Beispiel eines vollständigen CGI Scripts in Perl usr bin perl w use strict use CGI Carp qw fatalsToBrowser my Datei 1 my Datei 2 split ENV QUERY STRING my Pfaddatei 1 usr web daten alt Datei 1 my Pfaddatei 2 usr web daten neu Datei 2 my Vergleich system cmp Pfaddatei 1 Pfaddatei 2 dev null print Content type text html n n print DOCTYPE HTML PUBLIC W3C DTD HTML 4 01 Transitional EN n print html head title Test Ausgabe title head body n if Vergleich 0 print tt Pfaddatei 1 tt br und br tt Pfaddatei 2 tt br strong sind gleich strong n else print tt Pfaddatei 1 tt br und br tt Pfaddatei 2 tt br strong sind verschieden strong n print body html n Erläuterung Das Beispielscript ermittelt den Inhalt der CGI Umgebungsvariablen QUERY STRING erwartet in dem übergebenen Parameter ein kaufmännisches Und und trennt den Teil davor und den dahinter in die Skalare Datei 1 und Datei 2 Die beiden Daten werden als Dateien interpretiert Ein Beispielaufruf des Scripts könnte lauten cgi bin script pl news htm news htm Das Script hängt die beiden gleichnamigen Dateien an unterschiedliche Pfadnamen auf dem Server und erzeugt damit zwei unterschiedliche Dateipfadangaben in den Skalaren Pfaddatei 1 und Pfaddatei 2 Mit system wird nun der Shell Befehl cmp unter Unix gestartet der zwei Dateien daraufhin überprüft ob sie gleich sind Dem Befehl werden die beiden Skalare mit den Pfadangaben übergeben Eine Ausgabe soll der

    Original URL path: http://html.ekiwi.de/perl/funktionen/systemaufrufe.htm (2016-04-25)
    Open archived version from archive



  •