Schrift
[thread]7839[/thread]

backreferences und '\n'



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
snarf
 2006-03-29 15:15
#64166 #64166
User since
2003-08-14
77 Artikel
BenutzerIn
[default_avatar]
Hallo,

was übersehe ich denn hier ???

Habe einen Skalar (zuweilen mit multi-lines) und möchte mit einen Teil des Ausdrucks (steht schon in {}) mit in zusätzliche {} packen.

Code: (dl )
$title =~ s /(\{.+\}/\{$1\}/


soweit - so gut. Jedenfalls fast ...

Bei single-line Skalaren geht alles reibungslos, bei multi-line Skalaren ignoriert er das replacing.

Abhilfe (replace \n) ist schon klar, aber ist dieses Verhalten eigentlich typisch ... oder steh ich mal wieder auf dem Schlauch?

Gruß
Dirk
vayu
 2006-03-29 15:25
#64167 #64167
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
als allererstes fehlt bei dir die schliessende runde Klammer :)

als zweites probier es mit

s///m (für multilines)

siehe perldoc perlop

Suchbegriff: s/PATTERN/REPLACEMENT/egimosx\n\n

<!--EDIT|vayu|1143631563-->
Taulmarill
 2006-03-29 15:26
#64168 #64168
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hm, der regex den du gepostet hast hat erst mal gar nicht funktioniert, das nächste mal bitte mit copy&paste anstatt abtippen.

annyway, versuch mal folgendes
Code: (dl )
$title =~ s/({[^}]+})/{$1}/gs;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
snarf
 2006-03-29 15:47
#64169 #64169
User since
2003-08-14
77 Artikel
BenutzerIn
[default_avatar]
** kopfschüttel **

grmpf, ich schiebs jetzt mal auf den knurrenden Magen, daß ich da nicht selbst dran gedacht hab ... '/s' reicht mir ja völlig.

@taumarill: würde ja c&p nutzen wenn der Rechner, auf dem ich das Problemchen hatte, am Netz hängen würde ...

@vayu: nein, ein '/m' habe ich ja implizit, ich brauchte halt genau das Gegenteil, also '/s'

Vielen Dank Euch beiden und sorry für den Schrebfeihler ...

Dirk
vayu
 2006-03-29 15:48
#64170 #64170
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
ah ... ok dann habbichs genau falschrum verstanden :D

auf jeden fall weisst jetzt wo du nachschlagen musst :P
snarf
 2006-03-29 16:18
#64171 #64171
User since
2003-08-14
77 Artikel
BenutzerIn
[default_avatar]
War ja auch mal wieder eine überaus minimalistische Beschreibung meinerseits ... :blush:
sid burn
 2006-03-30 00:49
#64172 #64172
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=Taulmarill,29.Mar..2006, 13:26]hm, der regex den du gepostet hast hat erst mal gar nicht funktioniert, das nächste mal bitte mit copy&paste anstatt abtippen.

annyway, versuch mal folgendes
Code: (dl )
$title =~ s/({[^}]+})/{$1}/gs;
[/quote]
Hier möchte ich nur kurz Anmerken das die Verwendung der Option /s unnötig ist. Die Option verändert den String $title nicht. Die Option verändert die bedeutung des Punktes von Standadmäßig [^\n] darauf das es auf absolut jedes Zeichen passt. Da du aber gar keinen Punkt in deiner Regex hast, kannst du diesen auch weg lassen.

----

Ansonsten mal eine andere Frage, du möchtest Praktisch das um jeder geschweiften Klammer eine neue geschweifte Klammer steht?

Eigentlich ist das doch Identisch wenn du einfach jede öffnende und schließende Klammer durch zwei öffnende und schließende Paare ersetzt. Also:

$text =~ s/{/{{/g;
$text =~ s/}/}}/g;

Ist eigentlich Logischer, und dürfte deutlich Performanter sein. Das was ja zwischen den beiden paaren steht möchtest du ja anscheind nicht auslesen, und auch nicht wiederverwenden, von daher wäre eine Speicherung mit Klammern eine reine Performance verschwendung.

Gedanken über Single-line Modus und Multi-line Modus musst du dir erst machen, wenn du Sonderzeichen wie dem Punkt, Zirkumflex(^) und das Dollarzeichen in deiner Regex verwendest. Da die Optionen /s und /m nur dessen bedeutung verändert. Wenn du diese Zeichen nicht benutzt, wird jeder String komplett betracht, egal ob er über mehrere Zeilen geht, oder nicht.

Die bedeutung Single/Multi line ist auch nicht wirklich passend.\n\n

<!--EDIT|sid burn|1143665724-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-03-30 01:02
#64173 #64173
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Deine zwei Regexes sind nicht identisch mit dem Vorschlag von Taulmarill

Taulmarill:
Code: (dl )
1
2
3
4
5
6
C:\Dokumente und Einstellungen\Renee>perl
my $string = "test {hallo} test }";
$string =~ s/({[^}]+})/{$1}/g;
print $string;
^D
test {{hallo}} test }


Deine Lösung:
Code: (dl )
1
2
3
4
5
6
7
8
C:\Dokumente und Einstellungen\Renee>perl
my $string = "test {hallo} test }";
$string =~ s/{/{{/g;
$string =~ s/}/}}/g;
print $string;
^D
test {{hallo}} test }}
C:\Dokumente und Einstellungen\Renee>
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/
sid burn
 2006-03-30 01:24
#64174 #64174
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=renee,29.Mar..2006, 23:02]Deine zwei Regexes sind nicht identisch mit dem Vorschlag von Taulmarill[/quote]
Oh sorry,

stimmt. Den Fall auf Fehlerhafte Daten bin ich nicht eingegangen, und bin davon ausgegangen das Die Klammern nur Paarenweise auftreten.

Ich dachte man könnte es noch einfacher schreiben, habe ich mich leider getäuscht.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-03-30 01:27
#64175 #64175
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das muss der Threadstarter wissen, wie die Daten vorliegen. Deswegen kann man weder über Deine noch über Taulmarills Vorschlag sagen "Das ist richtig oder falsch"!
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/
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-03-29 15:15.