Backslash in einem Pfad ersetzen fuehrt zu "Can't find Unicode property definition "e" at -e line 1, line 1."

23/11/2009 - 19:12 von Thomas Steinbach | Report spam
Hallo,

ich habe hier Windows und Strawberry Perl.
Wenn ich nun folgendes machen, bzw in einer Datei
config_data eine Pfad ersetzen will:

File: test.pl
snip
#!/usr/bin/perl
system( qw(perl -p -i.bak -e), 's/perl.exe/#!perl/', config_data );
snap

File: config_data
snip
#!C:\strawberry\perl\bin\perl.exe

use strict;
use Module::Build 0.25;
use Getopt::Long;
# [much more code]
snap

klappt das wunderbar. Aber:
Wenn ich nun _auch_ einen Backslash _mit_ ersetzen will,
dann bekomme ich wegen dem "\p" einen Fehler, da hier
versucht wird das \ als "named Property" zu interpretiern.

Ein Verdoppeln des backslashes bringt nichts. btw: Warum eigentlich?
Normalerweise und IMHO wird doch ein Backslash durch einen
zusaetzlichen Backslash maskiert, oder?

Also ein:
system( qw(perl -p -i.bak -e), 's/bin\perl.exe/#!perl/', config_data );
oder auch mit doppeltem backslash
system( qw(perl -p -i.bak -e), 's/bin\\perl.exe/#!perl/', config_data );
fuehrt wegen dem \p zu:

Can't find Unicode property definition "e" at -e line 1, <> line 1.

Ich habe dazu das hier gefunden:
http://www.perlmonks.org/?node_ide100
Weiss aber dennoch nicht wie ich nun weiter vorgehe.

Es wird zwar vorgeschlagen dass ein:
"The workaround is to replace backslashes by slashes before using such paths
in a matching operation "
helfen mag, aber ich suche doch _in_ einer Datei, wenn ich mit so
einem Einzeiler ersetzen will und da steht der Pfad nunmal als
bzw. mit backslash hmmm

Ich hoffe hier kann mir einer einen entscheidenden Tip geben,
wie das zu machen ist.

Irgendwie muss man das ja in so einem system() Aufruf matchen koennen,
sonst koennte man Windows/DOS Pfade ja nie auf diese Weise ersetzen.
Und das glaube ich bei perl nicht ;-)

Thomas
 

Lesen sie die antworten

#1 Wolf Behrenhoff
23/11/2009 - 20:25 | Warnen spam
Thomas Steinbach schrieb:
Ein Verdoppeln des backslashes bringt nichts. btw: Warum eigentlich?
Normalerweise und IMHO wird doch ein Backslash durch einen
zusaetzlichen Backslash maskiert, oder?

Also ein:
system( qw(perl -p -i.bak -e), 's/bin\perl.exe/#!perl/', config_data );
oder auch mit doppeltem backslash
system( qw(perl -p -i.bak -e), 's/bin\\perl.exe/#!perl/', config_data );
fuehrt wegen dem \p zu:

Can't find Unicode property definition "e" at -e line 1, <> line 1.



Auch in einfachen Anführungszeichen wird \\ durch \ ersetzt, damit man
das eifnache Anführungszeichen quoten kann. Das heißt
's/bin\\perl.exe/#!perl/' eq 's/bin\perl.exe/#!perl/' ist true.

Du brauchst also noch 2 Backslashes mehr, also insgesamt 4 hintereinander.

Wolf

Ähnliche fragen