IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Perl - Fileoperationen und Directoryoperationen



Fileoperationen und Directoryoperationen

Fileoperationen (lesen, schreiben, anfuegen, lesen des outputs von programmen) und Directoryoperationen (opendir, readdir) werden vorgestelt.


Autor: Franz Schaefer (mond)
Datum: 24-02-2002, 11:59:52
Referenzen: man perlop
man perlfunc
Schwierigkeit: Anfänger
Ansichten: 3344x
Rating: Bisher keine Bewertung.

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Übersicht

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,"

while() {
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..

_______________________________________________
CD ist ein service von SILVER SERVER
der inhalt unterliegt der GFDL
_______________________________________________



[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04511
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06248
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1158
Comments: 0