Monday, February 02, 2009

Leerzeichen in Pfaden *grrr*

Ich habe mich gerade an einer OTRS-Installation auf meinem Windows-Laptop versucht. Allerdings habe ich nicht den Windows-Installer genommen, sondern direkt die Quellen. Natürlich habe ich einen Pfad mit Leerzeichen genommen und schon ging nix mehr...

Schnell stieß ich auf folgenden Code:

my $Dir = $Self->{ConfigObject}->Get('TemplateDir') . '/HTML/';
if ( -e $Dir ) {
my @Files = glob("$Dir/Layout*.pm");
}

Dazu muss man wissen, dass glob den String an den Leerzeichen "aufteilt", also wird z.B. aus "C:\Program Files" das hier:

glob('C:\Program','Files/Layout*.pm');

glob liefert bei einem String ohne Wildcard einfach diesen String zurück...

Jetzt gibt es zwei mögliche Lösungen:

Erstens die alte 8.3-Schreibweise verwenden, da es dabei keine Leerzeichen gibt. Der Pfad würde dann so aussehen: "C:\PROGRA~1". Die "guten" alten DOS-Zeiten lassen grüßen.

Zweitens: Die Installation einfach in ein Verzeichnis ohne Leerzeichen schieben.

Ich habe mich für zweitens entschieden, weil das jetzt schneller ging, der Windows-Installer nimmt die erste Möglichkeit.

3 comments:

rainboxx said...

Das ist natürlich sehr doof, dass glob an Leerzeichen aufteilt - zumindest in diesem Fall. Allerdings sollte man ja generell darauf verzichten, Leerzeichen in Pfadnamen zu setzen. Unter Windows ist das natürlich an mehreren Stellen ein Problem...

ReneeB said...

Tja, ist halt Windows ;-) Aber man denkt im ersten Moment ja auch nix böses, wenn man so Programme installiert. Der Teufel steckt eben im Detail...

glob macht ja das Richtige!

SprG said...

Deshalb verwende ich statt
@list = glob(...);

lieber
use File::Glob ':glob';
@list = bsd_glob(...);

In der Hilfe zu File::Glob heiszt es

Since v5.6.0, Perl's CORE::glob() is implemented in terms of bsd_glob().
Note that they don't share the same prototype--CORE::glob() only accepts
a single argument. Due to historical reasons, CORE::glob() will also
split its argument on whitespace, treating it as multiple patterns,
whereas bsd_glob() considers them as one pattern.