Also, wieder einmal etwas aus (meiner) Praxis:
Nachdem ich mich ja immer noch mit dem Verarbeiten von Webseiten beschäftigte, tauchte das Problem auf, daß ich Dateiendungen in <img...> oder <link...>-Tags herausfinden wollte.
Die einzelne Extraktion hab ich ja schon hier beschrieben, also wie man zum Beispiel an den Dateiname kommt.
Aber wie jetzt gezielt an die Endung kommen?
Ganz leicht, denkt man, aber: Wie immer gibt es verschiedene Arten von Schreibweisen, bzw. Endungen.
Das Leichteste ist ja zum Beispiel:
<a href="text.htm">
Hier holt man sich aus dem href-tag das text.htm, sucht nach dem Punkt und holt den Rest als Dateiendung.
Übergeben wird der Dateiname ohne Anführungszeichen oder sowas. Falls keine Dateiendung vorhanden ist, gibts ein undef zurück, ansonsten die Endung.
Und wie funktioniert es?
Der Übergabewert wird $text zugewiesen und auf einen Punkt geprüft. Falls keiner vorhanden ist, gehts umgehend zurück.
Falls ein Punkt da ist, egal wo, wird ein split mit ? durchgeführt. In $endung landet der erste Wert des split, darum auch die Klammer. Ohne Klammer würde sonst in $endung die Anzahl der Bruchstücke des split stehen. Aber das nur so am Rande...
Ich erklär das am besten gleich am Beispiel:
Aus
http://www.sonstwas.de/dingens.php?parameter=1.2.4
wird
http://www.sonstwas.de/dingens.php
Danach kommt ein split mit einem Punkt. Die Dateiendung ist der letzte Wert des split (-1 ist ja immer der letzte Wert eines Arrays, also alles, was hinter dem letzten . steht).
Fertig. Das Ergebnis wird zurückgegeben.
Die Funktion ist bereits sehr optimiert, verwendet keine temporären Arrays, und ist ziemlich schnell.
Mit einer Regex wäre es wohl auch gegangen, aber wozu die große Regex-Maschine anwerfen, wenn es so einfach mit dem schnellen split geht?
Nachtrag
Woran ich gestern nicht gedacht habe ist, daß man ja auch eine Hauptdomain übergeben könnte, also zum Beispiel http://www.hidemail.de/blog. In einem solchen Fall würde die Routine nicht korrekt arbeiten, da ja gar kein Dateiname enthalten ist.
Also hab ich die Subroutine eben noch erweiter, so daß auch dieser Fall verarbeitet wird:
sub find_endung{ my $text=shift;
$text=~ s/\/$//; my $isurl=shift;
if ($isurl == 1){ # ist der Text eine URL? my @parts=split(/\//,$text);
return if @parts == 3; # wenn 3 Teile vorhanden sind, dann ist es eine Hauptdomain
$text=; # ansonsten ist die Dateiendung im letzten Teil
}
So, jetzt ist's zwar nicht mehr so kurz, funktioniert aber besser. Als zweiter Parameter wird übrigens eine 1 übergeben, falls die zu durchsuchende Zeile eine URL darstellt.
Kommentare zum Beitrag "Dateiendung herausfinden mit Perl"
Kommentar von s
Hab nur kurz rübergeschaut, aber ich glaube die Dateiendung wird in diesem Skript, wenn im Dateinamen mehrere Punkte sind, nicht korrekt herausgefunden!
aushelfen sollte:
my ($text,$endung) = split(/\.$/, $file);
Viele Grüße,
s.
Kommentar von Admin
Sorry, aber das Script arbeitet schon korrekt so wie es ist. Auch mehrere Punkte im Dateinamen, sowohl als URL oder als normaler Dateiname, bringen korrekte Ergebnisse.
Kommentar von Tom
Beim Beispiel von Kommentator "s" muss hinter das Dollarzeichen noch ein Plus.