ABSTRACT: perl: fileoperationen (lesen, schreiben, anfuegen, lesen des outputs von programmen) und directory (opendir, readdir) operationen werden vorgestelt. AUDIENCE: perl beginners SYSTEM: any unix SECTION: perl AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt bis jetzt haben wir immer von STDIN gelesen. das ist praktisch fuer kleine filterprogramme. oft will man aber direkt aus einem file lesen. das geht wie folgt: #!/usr/bin/perl -w open(BLA,") { chomp; print "gelesene zeile: $_\n"; } close(BLA); obiges sciprt liest z.b die datei /etc/passwd. dazu wird ihr der filehandle BLA. der ist jetzt das equivalent zu STDIN. (es existiert die konvention dass man filehandels in grossbuchstaben schreibt). das "or die" hinter open wir aufgerufen falls das open fehlschlaegt. der "die" befehl beendet das programm mit der angegebenen fehlermeldung. das < beim open gibt an dass wir die datei zum lesen offenen. wuerden wir eine datei zum schreibe oeffnen wollen wuerden wir > schreiben: #!/usr/bin/perl -w open(BLI,">blabla.txt") or die "das file kann nicht geschrieben werden"; print BLI "bla bla bla\n"; close(BLI); dieses script schreibt die zeile "bla bla bla" in das file "blabla.txt" im aktuellen verzeichniss. man beachte das kein beistrich zwischen BLI und dem text den man mit print ausgeben will sein darf. wuerden wir die date mit open(BLI,">>blabla.txt"); oeffnen so wuerden wir der text an eine eventuell schon vorhandene blabla.txt angefuegt werden. neben files kann das open auch programme starten und deren ausgabe lesen oder in deren STDIN schreiben (leider nicht beides gleichzeitig): open(BLA,"who|") or die "can not run who"; while() { chomp; @fields=split(' '); print join('|',@fields),"\n"; } close(BLA); das open(BLA,"who|") starte das programm und verbindet das filehandel BLA mit der ausgabe des programmes. analog: #!/usr/bin/perl -w open(BLA,"|mail -s test fs\@mond.at") or die "can not execute mail programm"; print BLA "hallo du da\n"; close(BLA); obiges program verschickt eine mail an mich in dem das programm "mail" aufgerufen wird. das | besagt das unser filehandle BLA auf STDIN des aufgerufenen programmes verbunden wird. obiges programm ist also das selbe wie: echo hallo du da | mail -s test fs@mond.at man beachtet das \ vor dem @. dieses "escape" ist notwendig weil sonst perl denkt man wollte das array mit den namen @mond hier einsetzen... eine gute altenative ist statt der " " anfuehrungszeichen einfache gaensefuesschen zu verwenden: 'fs@mond.at' ist eine stringkonstante in der perl NICHT versucht stringersetzungen zu machen. eine elegantere methode programme aufzurufen ist: open(BLA,"|-") or exec "/usr/bin/mail" , "-s" , "test" , "fs\@sil.at" ; der vorteil hier ist das der aufruf von programmen via exec sicherer ist da perl das programm direkt mit den angegebenen parametern aufruft ohne umwege ueber einen shell interpreter. obige beispiele funktionieren natuerlich nur wenn die entsprechenden programme existieren. um mail auch auf nicht unix system verschicken zu koennen gibt es perl module (davon spaeter) die solche funktionen abstrahieren.. #!/usr/bin/perl -w opendir(HIER,".") or die "kann aktuelles verzeichniss nicht lesen\n"; while($name=readdir(HIER)) { print "filename ist $name\n"; } closedir(HIER); obiges script liest das directory "." und gibt alle darin gefundenen filenamen aus. ruft man den befehl "readdir" in einem kontext auf in dem als ergebniss ein array erwartet wird so kann readdir alle namen auf einmal lesen: #!/usr/bin/perl -w opendir(HIER,"/etc") or die "kann verzeichniss nicht lesen\n"; @allenamen=readdir(HIER); closedir(HIER); print join(",",@allenamen); obiges script gibt alle filenamen aus dem /etc verzeichniss mit "," getrennt aus. zuletzt noch eine andere praktische methode um unix kommandos aus perl aus aufzurfen: $datum=`date`; $verzeichniss=`pwd`; obiges ruft den befehl "date" und den befehl "pwd" auf. alternativ kann man schreiben: $verzeichniss=qx/pwd/; EXERCISES: * lies das file /etc/passwd und gib eine liste aller user und ihrer homeverzeichnisse aus. * verwende opendir, readdir um in obiger liste auch noch die anzahl der files anzugeben die sich (direkt) in dem homeverzeichniss befinden. (achtung: manche user lassen dich eventuell ihre verzeichnisse nicht lesen) * verwende `` und du -s um die summe des von den usern in ihren homeverzeichnissen belegeten plattenspeichers zu berechnen. * erweiteres das script so dass es allen usern mit einer userid > 200 die mehr als 300000k an diskspeicher belegen eine mail schreibt die mitteilt wieviel speicher belegt wurde.. REFERENCES: man perlop man perlfunc