Thread Ersetzungstring mit $1 im Voraus "kompilieren" (5 answers)
Opened by GwenDragon at 2012-02-15 16:00

GwenDragon
 2012-02-15 16:00
#156135 #156135
User since
2005-01-17
14760 Artikel
Admin1
[Homepage]
user image
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:
more (15.7kb):
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>
                    .

View full thread Ersetzungstring mit $1 im Voraus "kompilieren"