====== Perl ====== __Auch selbst geschriebene Perl-Module müssen im Perl-Lib-Pfad abgelegt werden!__ Die einkompilierten Perl-Lib-Pfade kann man so auslesen: hier ein Beispiel von Ubuntu 14.04: > perl -V | sed -ne '/@INC:/,/^$/p' @INC: /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl . Dabei bietet sich das letzte Verzeichnis, zum ablegen eigener Module, geradezu an. ===== Dateioperationen ===== * [[http://www-ik.fzk.de/~apel/html-Buch_2/tecj.htm]] ==== allgemein ==== #!/usr/bin/perl open(NEUIGKEITENDATEI, "<", "news.txt"); # Datei zum lesen öffnen print NEUIGKEITENDATEI "hier steht der Text\n"; # in die Datei schreiben close(NEUIGKEITENDATEI); # Datei schließen open(NEUIGKEITENDATEI, ">", "news.txt"); # Datei zum schreiben öffnen print NEUIGKEITENDATEI "hier steht der Text\n"; # in die Datei schreiben close(NEUIGKEITENDATEI); # Datei schließen open(NEUIGKEITENDATEI, ">>", "news.txt"); # Datei zum anhängenden schreiben öffnen print NEUIGKEITENDATEI "hier steht der Text\n"; # in die Datei schreiben close(NEUIGKEITENDATEI); # Datei schließen open(NEUIGKEITENDATEI, "+>", "news.txt"); # Datei zum lesen und schreiben öffnen print NEUIGKEITENDATEI "hier steht der Text\n"; # in die Datei schreiben close(NEUIGKEITENDATEI); # Datei schließen if(open(COUNTERDATEI, "<", "counter/counter.dat") == false) { print "Counter-Datei nicht gefunden\n"; } open(COUNTERDATEI, "<", "counter/counter.dat") || die "Counter-Datei nicht gefunden\n"; Datei löschen: #!/usr/bin/perl use strict; use CGI::Carp qw(fatalsToBrowser); my $result = unlink ("news.txt"); $result = unlink ("../news.txt"); $result = unlink ("/tmp/news.txt"); Datei verschieben: use File::Copy; move( "/tmp/news.txt", "./news.txt" ) or die "Das Verschieben ging nicht!: $!"; ==== Datei zeilenweise einlesen ==== #!/usr/bin/perl @Zeilen = (""); open(MAILDAT, "<", "inbox.dat") || die "Datei mit E-Mails nicht gefunden\n"; while() { push(@Zeilen,$_); } close(MAILDAT); for(@Zeilen) { if(/HTML/) { print $_; } } ==== Datei zeichenweise einlesen ==== #!/usr/bin/perl @Vokale = ("a","e","i","o","u"); @Anzahl = (0,0,0,0,0); open(DATEI, "<$ARGV[0]") || die "$_[1] nicht gefunden\n"; while(($AktuellesZeichen = getc(DATEI)) ne "") { for($i=0;$i<=4;++$i) { if($AktuellesZeichen eq $Vokale[$i]) { $Anzahl[$i]++; } } } close(DATEI); for($i=0;$i<=4;++$i) { print "$Vokale[$i] kommt in $ARGV[0] isg. $Anzahl[$i] mal vor\n"; } ==== in Datei schreiben ==== #!/usr/bin/perl $uebergabe = $ARGV[0]; open(DATEI, ">", "/tmp/test.txt"); print DATEI "Test 0001\n"; print DATEI split(/\n/, $uebergabe),"\n"; close(DATEI); #!/usr/bin/perl # Dieses Beispiel liest eine kommabegrenzte Datei mit Adressen ein # und schreibt sie HTML-formatiert in eine neue Datei @Adressen = (""); # Speicher für alle Datensaetze @Datensatz = (""); # Speicher für alle Felder des aktuellen Datensatzes $Felder = ""; # Speicher für die Namen der Felder (stehen in der ersten Dateizeile $i = 0; open(ADRESSEN, ") # Kommabegrenzte Datei einlesen { if($i == 0) # erste Zeile der Datei einlesen { $Felder = $_; # Feldnamen ermitteln } else { $Adressen[$i] = $_; # ab zweiter Zeile in @Adressen einlesen } $i++; # Datensatzzähler erhöhen } close(ADRESSEN); $Anzahl = $i - 1; # Anzahl Datensätze merken chop($Felder); @Datenfelder = split(/,/,$Felder); # Erste Zeile mit Feldnamen aufdröseln open(ADRESSENDAT, ">adressen.htm"); # HTML-Datei zum Schreiben öffnen print ADRESSENDAT "\n\n"; # HTML-Datei schreiben print ADRESSENDAT "Adressen\n"; print ADRESSENDAT "\n\n"; for(@Adressen) # solange Daten in der Adressenliste sind { @Datensatz = split(/,/,$_); # Aktuellen Datensatz aufdröseln $i = 0; for(@Datensatz) { print ADRESSENDAT "$Datenfelder[$i]: $Datensatz[$i]
\n"; # Aktuellen Datensatz schreiben $i++; } } print ADRESSENDAT "\n\n"; close(ADRESSENDAT); print $Anzahl," Datensaetze geschrieben\n"; # Nur zur Kontrolle: auf Standardausgabe ===== Beispielschnipsel ===== ==== STDIN ==== === simpel === while() { print $_; } === stdin2syslogd === #!/usr/bin/perl -w use Sys::Syslog; use IO::Handle; $ident="@ARGV"; # Prozessname: "logger -t" $logopt="pid,cons"; # pid,ndelay,cons,nowait $facility="local7.notice"; # Facility: "logger -p" openlog $ident, $logopt, $facility; $io = new IO::Handle; if ($io->fdopen(fileno(STDIN),"r")) { $daten = $io->getline; $io->close; $counter++; syslog ($facility, "%d: $daten", $counter); } closelog; Beispielaufruf: # echo "Das ist ein Test: test0002" | /usr/local/bin/logger.pl Test_Tag ===== lwp-request ===== ==== lwp-request problem ==== > lwp-request https://hostname.domain.de/test.html Can't connect to hostname.domain.de (certificate verify failed) LWP::Protocol::https::Socket: SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/share/perl5/LWP/Protocol/http.pm line 41. Manchmal möchte man (auch wenn es unsicher ist) die SSL-Überprüfung abschalten. === Lösung: Ubuntu 12.04 === In Ubuntu 12.04 muss die Datei ''/usr/bin/lwp-request'' bearbeitet werden (Überprüfung des Hostnamens abschalten => "1" gegen "0" tauschen). $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0; === Lösung: Ubuntu 14.04 === In der Version 6.05 vom Paket libwww-perl (Ubuntu 14.04), muss die Datei ''/usr/share/perl5/LWP/UserAgent.pm'' bearbeitet werden (Überprüfung des Hostnamens abschalten => "1" gegen "0" tauschen). $ssl_opts->{verify_hostname} = 0; === Lösung: Ubuntu 16.04 === In der Version 6.15 vom Paket libwww-perl (Ubuntu 16.04), muss die Datei ''/usr/share/perl5/LWP/Protocol/https.pm'' bearbeitet werden (SSL-Überprüfung abschalten => "1" gegen "0" tauschen). $ssl_opts{SSL_verify_mode} ||= 0;