Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

2 views
Skip to first unread message

Thomas Steinbach

unread,
Nov 23, 2009, 1:12:17 PM11/23/09
to
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_id=65100
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

Wolf Behrenhoff

unread,
Nov 23, 2009, 2:25:02 PM11/23/09
to
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

Karl Pflästerer

unread,
Nov 24, 2009, 2:49:11 AM11/24/09
to
"Thomas Steinbach" <stei...@gmx-topmail.de> writes:


[...]

> 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.

[...]

> 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 ;-)

Wieso eigentlich system()? Bez�glich der Backslashes wurde ja schon
etwas geschrieben, aber wenn du einfach nur in ein paar Dateien etwas
ersetzen willst, nimm doch File::Find. Das k�nnte zB so simpelst so
aussehen:

use strict;
use warnings;
use File::Find;

my $re = qr/bin\\perl.exe/;
my $replacement = '#!perl';
my $wanted = qr/\.pl$/;

sub wanted {
return unless /$wanted/;
local $^I = '~';
local @ARGV = ($File::Find::name);
while (<>) {
s/$re/$replacement/ if /$re/;
print;
}
}

find(\&wanted, @ARGV);


Das rufst du mit dem *absoluten* Pfad zu dem Verzeichnis auf, in dem deine
Perl-Dateien liegen und File::Find k�mmert sich darum, in alle
Unterverzeichnisse zu wechseln.

KP

0 new messages