Leser: 31
2010-08-28T10:41:16 jan99Gibt es in PERL einen einfachen Weg um den relativen Pfad von dem Report auf die Daten aus den o.g. Daten zu ermitteln (Ergebnis: ../daten/meinedaten.txt) ???
2010-08-28T11:29:53 GwenDragonWelchen Grund gibt es für dich, relative Pfade anzugeben?
2010-08-28T10:41:16 jan99Gibt es in PERL einen einfachen Weg um den relativen Pfad ... zu ermitteln
1 2 3 4 5 6 7 8 9 10 11 12 13 14
sub rel_path($$) { my ($target,$start) = @_; $start =~ s:/[^/]+:/:; # remove trailing filename my @spath = grep {$_ ne ''} split(/\//,$start); my @tpath = grep {$_ ne ''} split(/\//,$target); # strip common start of the path while ( @spath && @tpath && $spath[0] eq $tpath[0]) { shift @spath; shift @tpath; } return ("../"x(@spath)).join('/', @tpath); }
Guest werUnd was machst du bei Windowspfaden oder den alten MacOS Pfaden?
Nicht bei allen Systemen ist der Pfadtrenner "/".
Guest werWarum also eine unzureichende Lösung nutzen wenn man ein CoreModul nutzen kann? Sind Module so grauenvoll?
Es kann sinnvoll sein etwas eigenes zu schreiben, wenn man für eine einzige Funktion nicht extra ein ganzes Modul mitliefern will. Aber wenn man ein CoreModul hat, dann macht das basteln von einer eigenen Lösung selten Sinn.
Guest werFile::Spec bietet das alles. Warum also eine unzureichende Lösung nutzen wenn man ein CoreModul nutzen kann? Sind Module so grauenvoll?
2010-08-31T13:17:09 clmsZu File::Spec - nein kannte ich vorher noch nicht (und ich halte das auch für kein Verbrechen). abs2rel() kann man für die gewünschte Funktion tatsächlich nehmen. Der benötigte Wrapper ist ziemlich einfach: Vor beide Argumente ein "/" hängen und bei $base noch den Filenamen entfernen.
1 2 3 4 5 6
use File::Spec::Functions ':ALL'; my $report = catfile "report", "meinbericht.html"; my $data = catfile "daten", "meinedaten.txt"; my $fromto = abs2rel rel2abs($report), rel2abs +(splitpath $data)[1];
2010-08-31T13:17:09 clmsDas von Dir angesprochene Problem mit den Windows- und MacOS-Pfaden würde File::Spec aber auch nicht lösen, da es nur die Pfadtrenner des eigenen Betriebssystems berücksichtig. Und es ist laut Doku nicht garantiert, dass die betreibsystemspezifischen Varianten auch unter einem anderen Betriebssystem funktionieren.
2010-08-31T19:06:46 pqwenn man aber weiss, was für pfade man gerade behandelt, kann man direkt File::Spec::Win32, File::Spec::Unix etc. verwenden.
wenn man nicht weiss, was für pfade man hat, wirds eh problematisch.
QuoteSince some modules (like VMS) make use of facilities available only under that OS, it may not be possible to load all modules under all operating systems.
2010-08-31T20:05:39 clmsQuoteSince some modules (like VMS) make use of facilities available only under that OS, it may not be possible to load all modules under all operating systems.
Selbst wenn das Modul heute unter meinem OS funktionieren würde, würde ich mich nicht auf so ein undocumented feature verlassen. Vielleicht jemand in ein paar Jahren eine neuere Version von File::Spec und mein Skript produziert plötzlich Müll.
2010-08-31T19:06:46 pqwenn man z.b. unter linux windows-pfade bearbeiten will, wird das nicht so einfach funktionieren.
2010-08-31T22:06:44 MatthiasWStimmt, ich kann mir im Moment nur keine Situationen vorstellen, in welchen man den Pfad, mit dem man arbeiten möchte, *nicht* mittels catdir() oder catfile() zusammenbauen kann.
2010-08-31T22:06:44 MatthiasWWann bekomme ich denn schon einen fremden Pfad, der nicht korrekt formatiert ist?