Thread Ersetzungstring mit $1 im Voraus "kompilieren"
(5 answers)
Opened by GwenDragon at 2012-02-15 16:00
Ich versuche gerade in aus einem Hash für s/// die Such-und Ersetzungsstrings auszulesen.
Der Suchstring ist dabei mit qr und der Ersetzungsstring ist eine Zeichenkette mit dem q-Operator erzeugt. Ich habe nun in der sub repl das Problem, dass das Ersetzen bei "normalen" Zeichenketten funktioniert, aber wenn ich jedoch eine Backreferenz mit $1 o. ä. drin habe nicht mehr. Wo ist mein Denkfehler. Testcase: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 #!/usr/bin/perl use strict; use warnings; my $comment = join "", <DATA>; my %replaces = ( '/video.google.com/' => { name => 'Google-Video', from => qr'\/videoplay\?', to => q'/googleplayer.swf?' }, 'youtube.com/' => { name => 'Youtube', from => qr'\/watch\?v=', to => q'/v/' }, 'myvideo.de/' => { name => 'MyVideo', from => qr'\/watch\/(\d+)\/.+', to => q'/embed/$1' }, 'clipfish.de/' => { name => 'Clipfish', from => qr'\/video\/(\d+)\/.+', to => q'/embed_video/?vid=$1' }, # ); my $repl = sub { my $url = shift; my $template = shift; my $src; return if not length $url; for my $k ( keys %replaces ) { if ( $url =~ /$k/ ) { my $from = $replaces{ $k }->{ from }; my $to = $replaces{ $k }->{ to }; $src = $url if length $url and $url =~ /$from/; $url =~ s|$from|$to|e; $src = $url if not defined $src; $template =~ s|###NAME###|$replaces{$k}->{name}|g; $template =~ s|###URL###|$url|g; $template =~ s|###SRC###|$src|g; return $template; } } return qq{<p style="color:red"><em>Video von '$url' kann nicht eingebettet werden!</em></p>}; }; my $regex = qr|\<VID\s+([^\>]+)?\s*\>|; while ( $comment =~ $regex ) { $comment =~ s|$regex|$repl->($1,q{ <object width="480" height="320" data="###URL###"> <embed src="###URL###"> <br>Der Browser kann das Video nicht darstellen</embed> </object> <br>Quelle: <a href="###SRC###">###NAME###</a> } )|egi; } print $comment; #### __DATA__ <VID http://youtube.com/watch?v=12345678> <VID http://video.google.com/videoplay?id=987654> <VID http://www.myvideo.de/watch/98767890/Blah_Blubb> . |