WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 09.07.2004, 01:00   #1
quaylar
Hero
 
Registriert seit: 28.09.2001
Beiträge: 940


Standard Perl: HTML Dateien bearbeiten

Hallo alle!

Bräuchte mal kurz einen Tipp. Vorerst: ich bin Newbie in Perl und möchte eine - so hatte ich geglaubt - einfache Aufgabe mittels Perl ausführen:

Ein Verzeichnis samt allen Unterverzeichnissen soll nach allen *.html Dateien abgesucht werden.
In sämtlichen html Dateien soll der string <META name=generator *>
rausgelöscht werden.
Vielleicht möcht ich später andere META Tags einfügen, aber im Moment will ich einfach mal diesen bestimmten raushaben.

Hört sich für mich einfach an - nachdem ich aber ein wenig in meinem "perl for dummies" Buch gelesen habe und dort keinen Weg gefunden habe Zeilen aus Textdateien zu löschen frag ich mich schön langsam ob das vielleicht doch nicht so einfach geht.
Ausserdem hab ich via groups.google.com etwas über ein libwww Modul gefunden das für meine Aufgabe anscheinend geeigneter sein soll?

Kann mir jemand einen Hinweis geben welchen Weg ich da gehen sollte?

mfG,

qu
____________________________________
Those who desire to give up Freedom in order to gain Security, will not
have, nor do they deserve, either one. -- Benjamin Franklin
quaylar ist offline   Mit Zitat antworten
Alt 09.07.2004, 07:47   #2
Hussl
Veteran
 
Registriert seit: 08.02.2001
Alter: 41
Beiträge: 320


Standard

Hallo!

Das folgende Beispiel liest alle Dateien eines Verzeichnis ein. Dann liest es alle html-Dateien aus und löscht die <meta ...> Zeile raus. Es erstellt aber eine neue Datei, so dass die alte noch erhalten bleibt. Man könnte noch einbauen, dass die Originaldateien auf *.bak etc. umbenannt werden...

Wie das funktioniert mit Unterverzeichnissen kann ich im Moment leider nicht sagen, da ich keine Zeit zum Testen hab. Aber ich könnte mir vorstellen, dass man zuerst testen muss obs ein Verzeichnis ist (z.B. mit if -d $variable) und dann dieselbe Prozedur noch einmal aufruft.

Hier also mein Skript:

Code:
#!/usr/bin/perl -w

my $Path = "D:\\work\\temp\\html\\";
my @AllFiles = ();

opendir(EIN, $Path) || die "Kann Ordner $Path nicht ”ffnen.\n$!";
@AllFiles = readdir(EIN);
closedir(EIN);

foreach(@AllFiles) {
	if ($_ =~ /.+\.html/) {
		print $_, "\n";
		open(EIN, "<".$Path.$_)      or die "Kann html-Datei nicht oeffnen.\n";
		open(AUS, ">".$Path."n_".$_) or die "Kann Ausgabedatei nicht oeffnen.\n";
		
		while(<EIN>) {
			chomp($_);
			next if ($_ =~ /\<META name\=generator .+\>/);
			print AUS $_, "\n";
		}
		close(AUS);
		close(EIN);
	}
}
Fragen? Fragen!

mfg
Hussl
____________________________________
Nein, ich bin nicht die Signatur, ich putz hier nur.

http://www.chili-it.at
Hussl ist offline   Mit Zitat antworten
Alt 09.07.2004, 13:23   #3
quaylar
Hero
 
Registriert seit: 28.09.2001
Beiträge: 940


Standard

Servus!

Danke für dein Script, coole Sache dass du das so schnell für mich programmiert hast - meine Fragen hierzu:

1) Grast "readdir" nicht ohnehin alle Verzeichnisse und Unterverzeichnisse ab?

2) was bedeutet @ vor der Variable?

3) die beiden OPEN Befehle versteh ich nicht, das erste Argument ist das Dateihandle, das 2te sollte der Dateiname sein, was machen die > und < Klammern und warum hängst du am Schluss die Variable für den Zeileninhalt an?

4) Seh ich folgendes richtig:

Das Script liest alle Html Dateien Zeile für Zeile, entfernt den Zeilenumbruch und schreibt in der While Schleife Zeile für Zeile in eine neue Datei wobei es mit dem "next if" Befehl den print Befehl überspringt sobald der Meta String in der Zeile auftaucht?

mfG,

qu
____________________________________
Those who desire to give up Freedom in order to gain Security, will not
have, nor do they deserve, either one. -- Benjamin Franklin
quaylar ist offline   Mit Zitat antworten
Alt 09.07.2004, 14:27   #4
Hussl
Veteran
 
Registriert seit: 08.02.2001
Alter: 41
Beiträge: 320


Standard

Hallo!

ad 1) da hast du recht. readdir listet alle Dateien (inkl. Verzeichnisse). Auch die "virtuellen" Verzeichnisse . (für das aktuelle) und .. (für das übergeordnete) Die Variable für den Zeileninhalt kommt aus der foreach(@AllFiles)-Schleife. In dieser steht der Dateiname der html-Datei.

ad 2) mit @list deklarierst du eine Liste (sprich Array).
wenn du mehr Informationen haben willst: http://de.selfhtml.org/cgiperl/sprache/listen.htm

ad 3) Richtig. Der erste Parameter ist das Filehandle. Der zweite Parameter der Dateiname. Mit den Zeichen < bzw. > kannst du bestimmen, ob du die Datei zum Lesen (<)oder zum Schreiben (>) öffnen willst.
Mehr Info: http://de.selfhtml.org/cgiperl/funkt...sgabe.htm#open

ad 4) Ja genau. Ich glaube den Zeilenumbruch müsste man gar nicht entfernen, aber das hab ich mir so angewöhnt

Grüße,
Hussl
____________________________________
Nein, ich bin nicht die Signatur, ich putz hier nur.

http://www.chili-it.at
Hussl ist offline   Mit Zitat antworten
Alt 09.07.2004, 14:42   #5
quaylar
Hero
 
Registriert seit: 28.09.2001
Beiträge: 940


Standard

Servus!

D.h. das hier:

opendir(EIN, $Path) || die "Kann Ordner $Path nicht ”ffnen.\n$!";
@AllFiles = readdir(EIN);
closedir(EIN);

erzeugt eine Liste aller Dateien und Verzeichnisse in meinem gewählten Arbeitsverzeichnis. Aber mit welchem Befehl krieg ich ihn dazu auch die Unterverzeichnisse und deren Dateien mitzunehmen? Das wär ja mein Ziel..alles gleich in einem Arbeitsgang...
____________________________________
Those who desire to give up Freedom in order to gain Security, will not
have, nor do they deserve, either one. -- Benjamin Franklin
quaylar ist offline   Mit Zitat antworten
Alt 09.07.2004, 15:11   #6
Hussl
Veteran
 
Registriert seit: 08.02.2001
Alter: 41
Beiträge: 320


Standard

Wenn du dich noch bis heute abend gedulden kannst, dann werd ich das mal skripten... vorher gehts leider nicht.
____________________________________
Nein, ich bin nicht die Signatur, ich putz hier nur.

http://www.chili-it.at
Hussl ist offline   Mit Zitat antworten
Alt 09.07.2004, 15:50   #7
quaylar
Hero
 
Registriert seit: 28.09.2001
Beiträge: 940


Standard

Ja klar kann ich mich gedulden - hätt ja gar net erwartet dass du das für mich scriptest
Dachte nur es gibt viell. eh einen solchen Befehl und du weisst ihn zufällig auswendig. Ich werd mal in der Zwischenzeit ein wenig danach googlen..

danke erstmal

qu
____________________________________
Those who desire to give up Freedom in order to gain Security, will not
have, nor do they deserve, either one. -- Benjamin Franklin
quaylar ist offline   Mit Zitat antworten
Alt 09.07.2004, 17:23   #8
quaylar
Hero
 
Registriert seit: 28.09.2001
Beiträge: 940


Standard

Ich glaub ich hab einen einfachen Weg gefunden: Kennst du das Modul File::Find?

Sieht so aus als könnte es damit gut funktionieren, allerdings check ich den Aufruf der Subroutine noch nicht so ganz, muss ich mir erst ansehn..
____________________________________
Those who desire to give up Freedom in order to gain Security, will not
have, nor do they deserve, either one. -- Benjamin Franklin
quaylar ist offline   Mit Zitat antworten
Alt 10.07.2004, 20:36   #9
Hussl
Veteran
 
Registriert seit: 08.02.2001
Alter: 41
Beiträge: 320


Standard

hallo, tut mir leid, dass ich mich erst jetzt melde. leider hat meine zeit noch nicht gereicht.

das modul file::find kenn ich leider nicht.

ich werd dir das skript aber noch machen... versprochen!
____________________________________
Nein, ich bin nicht die Signatur, ich putz hier nur.

http://www.chili-it.at
Hussl ist offline   Mit Zitat antworten
Alt 10.07.2004, 22:21   #10
spunz
Super-Moderator
 
Registriert seit: 22.03.2000
Beiträge: 9.666


spunz eine Nachricht über ICQ schicken
Standard

ich verwende dazu sed, villeicht ist hier was für dich dabei:

http://wiki.unixboard.de/index.php/Shell_1
spunz ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:48 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag