Schrift
[thread]8179[/thread]

Probleme mit $ beim Ersetzen: Emailpasswort ändern



<< >> 9 Einträge, 1 Seite
in2fire
 2006-07-19 00:18
#68244 #68244
User since
2006-07-04
6 Artikel
BenutzerIn
[default_avatar]
Ich möchte ein Passwort in einer Datei durch ein anderes austauschen.

Die Passwörter fangen nur dummerweise alle mit $1$ an und können ansonsten auch $-Zeichen enthalten.

Wenn ich die $ Zeichen rausnehme ersetzt er es so, wie er es soll. Mit den enthaltenen Dollerzeichen ersetzt er aber garnichts.

Code: (dl )
1
2
3
4
5
6
7
if ($_ =~ /($suchen_nach:)(.*)(:popuser:)(.*)/) {
$_ =~ s/$2/$passwd/;
push (@zeilen, $_);
}
else {
push (@zeilen,$_);
};
esskar
 2006-07-19 00:27
#68245 #68245
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du kannst so nach $-zeichen suchen und ersetzen

Code: (dl )
1
2
3
4
5
6
use strict;
use warnings;

my $s = 'text mit $-zeichen';
$s =~ s/\$/#/g;
print $s;
sid burn
 2006-07-19 11:27
#68246 #68246
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ein Dollarzeichen in einer Regex hat die besondere Bedeutung das es ein Stringende oder Zeilende darstellt. Wenn du das Zeichen finden möchtest, anstatt dessen bedeutung in einer Regex zu verwenden, dann musst du wie esskar gezeigt das Dollarzeichen escapen.

Dafür könntest du z.b. "quotemeta" benutzen, allerdings ist $1, $2... nicht veränderbar.

Daher kannst du auch einfach ein "\Q" in deiner Regex verwenden zum escapen.

Code: (dl )
s/\Q$2/$passwd/;

\Q escaped alle Zeichen bis zum Ende, oder bis zum nächsten auftretenden "\E".

Damit sollte dein Code jedenfalls funktionieren.\n\n

<!--EDIT|sid burn|1153294221-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-07-19 12:07
#68247 #68247
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=sid burn,19.07.2006, 09:27]Ein Dollarzeichen in einer Regex hat die besondere Bedeutung das es ein Stringende oder Zeilende darstellt. Wenn du das Zeichen finden möchtest, anstatt dessen bedeutung in einer Regex zu verwenden, dann musst du wie esskar gezeigt das Dollarzeichen escapen.[/quote]
Ein Dollarzeichen hat nur am Ende des RegEx die Bedeutung "Stringende". Mittdrin ist es das Sigil einer Variable - bei /$eins/ ist eben der Skalar $eins gemeint.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2006-07-19 17:13
#68248 #68248
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
oder s'$1$bla$blubb'neuespasswort'g;
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sid burn
 2006-07-19 17:31
#68249 #68249
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=renee,19.July.2006, 10:07][quote=sid burn,19.07.2006, 09:27]Ein Dollarzeichen in einer Regex hat die besondere Bedeutung das es ein Stringende oder Zeilende darstellt. Wenn du das Zeichen finden möchtest, anstatt dessen bedeutung in einer Regex zu verwenden, dann musst du wie esskar gezeigt das Dollarzeichen escapen.[/quote]
Ein Dollarzeichen hat nur am Ende des RegEx die Bedeutung "Stringende". Mittdrin ist es das Sigil einer Variable - bei /$eins/ ist eben der Skalar $eins gemeint.[/quote]
Code: (dl )
1
2
3
4
my $text = "Hallo\nWelt.\n";
if ( $text =~ m/^(.*?)$(.*)/sm ) {
print "[$1]\n[$2]\n";
}

Gibt bei mir folgendes aus:
Code: (dl )
1
2
3
4
[Hallo]
[
Welt.
]

Er hat also wie gewollt das Dollar als Zeilenendzeichen benutzt. Ob er es nun als zeilenendzeichen benutzt, oder ob er es als variable nimmt, dass muss die Regex Engine enstcheiden.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
docsnyder
 2006-07-20 16:37
#68250 #68250
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@sid burn

Ich verstehe die Ausgabe

Code: (dl )
1
2
3
4
[Hallo]
[
Welt.
]


nicht. Nach meinem Verständnis müsste eigentlich

Code: (dl )
1
2
3
4
[Hallo
]
[Welt.
]


ausgegeben werden? Das Linefeed ist doch Bestandteil einer Zeile und ist das letzte Zeichen vor dem Zeilenende (Dollar). Warum fällt dann \n in den zweiten Match ($2)?

Gruß, Doc
sid burn
 2006-07-20 17:01
#68251 #68251
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@docsnyder
Ne, ein $ Matcht immer genau vor einem "newline" Zeichen, und der Zirkumflex (^) matcht immer nach einen Newline zeichen.

Mit "$" wird also "\n" nicht mit eingeschlossen. Das ist so weil es nur anker sind, und keine Zeichen auffressen. So wie z.B. \b Das Newline zeichen wird erst durch den Punkt "aufgefressen". Jedenfalls nur dann wenn man auch /s benutzt.

Deswegen ist das "\n" in $2 enthalten.

Zum anderen selbst wenn das $ genau auf das Newline matchen würde, würde immer noch "hallo" und nicht "hallo\n" in $1 stehen. Da ich das $ ja gar nicht in meinen ersten Klammern habe.\n\n

<!--EDIT|sid burn|1153400504-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
in2fire
 2006-07-20 22:56
#68252 #68252
User since
2006-07-04
6 Artikel
BenutzerIn
[default_avatar]
Quote
s/\Q$2/$passwd/;


Das hat geklappt.
Vielen Dank.
<< >> 9 Einträge, 1 Seite



View all threads created 2006-07-19 00:18.