User since
2003-08-07
2921
Artikel
BenutzerIn
Hallo!
Hat zufällig schonmal jemand eine Lösung (z.B. eine RegEx) dafür gebaut wie man aus Pfaden im Format x/y/../z den intendierten Zielpfad machen kann? Ich abe das Problem, dass ich manchmal bis zu 4 mal ../ in einer Pfadangabe stehen habe (damit ich meine Scripten besser auf die Server im Internet übertragen kann ohne viel anpassen zu müssen).
Gibt es dafür vielleicht ein Snipplet oder ein Modul? Ansonsten muss ich es mir selber bauen.
Grüße, pktm
User since
2003-08-04
7321
Artikel
ModeratorIn
Path::Class
use Path::Class qw(dir);
print dir('/foo/../dir/')->cleanup;
aber vorsicht, das modul erzeugt einen OS spezifischen pfad, heißt unter windows werden die / zu \
User since
2003-11-28
3645
Artikel
ModeratorIn
Also bei mir macht das nichts:
use Path::Class qw(dir);
print dir('/tmp/../usr/')->cleanup;
/tmp/../usr
Und es ist auch klar warum: wenn es irgendwo symbolische Links gibt, dann gilt nicht zwangsläufig die Gleichung /A/../B == /B
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
Wenn es um reale Pfade geht, kann man es herausfinden. Und das Standardmodul Cwd macht es auch:
$ perl -Mstrict -Mwarnings -MCwd=realpath -le 'print realpath "/tmp/../usr/";'
/usr
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=ptk,28.03.2006, 00:46]Und es ist auch klar warum: wenn es irgendwo symbolische Links gibt, dann gilt nicht zwangsläufig die Gleichung /A/../B == /B[/quote]
ist das in deinem fall jetzt so?
bei mir - unter windows - liefert obiges Snippet das Ergebnis \dir
User since
2003-11-28
3645
Artikel
ModeratorIn
Klar, unter Windows gibt es auch keine Symlinks...
User since
2003-08-04
7321
Artikel
ModeratorIn
ist klar.
aber die frage ist, löst cleanup unter linux die .. generell nicht auf?
User since
2003-11-28
3645
Artikel
ModeratorIn
Siehe mein Beispiel oben. Es wurde nur das letzte Slash entfernt.
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=ptk,28.03.2006, 22:28]Siehe mein Beispiel oben. Es wurde nur das letzte Slash entfernt.[/quote]
es hätte ja sein können, dass das gerade an deinem system liegt, weil du irgendetwas verlinkt hast und du damit ein Gegenbeispiel geben wolltest!
User since
2003-11-28
3645
Artikel
ModeratorIn
Path::Class guckt nicht im realen System nach. Aber Cwd::realpath (wie in Dubus Beispiel) scheint das zu machen.