Schrift
[thread]11553[/thread]

Code in RegEx (Substitution) ausführen

Tags: Ähnliche Threads

Leser: 1


<< >> 3 Einträge, 1 Seite
pktm
 2008-04-02 05:07
#107722 #107722
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Wie mache ich das nochmal, dass ich Code innerhalb einer Substitutaion ausführen kann?

Ich möchte etwas in der Art:
Code: (dl )
$s =~ s/(.*[^0-9])([0-9])+([^0-9].*)/$1 ($2 >= 500 ? $data->{$2}->{node} : $data->{$2}->{node} . ' ' . $data->{$2}->{word} ) $3/g;


Denn: für den ersten Fall: die gefundene Zahl ist größer als 500 darf nur ein Wert eingefügt werden,
aber: für den zweiten Fall müssen 2 Werte eingefgt werden.

Ich meine schonmal irgendwo gelesen zu haben, dass das ginge, finde es aber nicht mehr :-/

Hier ein (lauffähiges) Beispiel:
Code: (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/Perl/bin/perl

package Test;

use strict;
use warnings;
use Perl6::Say;
use Data::Dumper qw/Dumper/;

sub new {
my $class = shift;

return bless({}, $class);
} # /new

sub run {
my $self = shift;

=comment

my $VAR1 = {'0' => [0,[[505,[[500,[[1],[2]]],[504,
[[3],[503,[[501,[[4],[5]]],[502,[[6],[507,[[7],[8]]]]]]]]]]],
[9]]],'500' => [500,[[1],[2]]],'501' => [501,[[4],[5]]],
'502' => [502,[[6],[507,[[7],[8]]]]],
'503' => [503,[[501,[[4],[5]]],[502,[[6],[507,[[7],[8]]]]]]],
'504' => [504,[[3],[503,[[501,[[4],[5]]],[502,[[6],[507,[[7],[8]]]]]]]]],
'505' => [505,[[500,[[1],[2]]],[504,[[3],[503,[[501,[[4],[5]]],
[502,[[6],[507,[[7],[8]]]]]]]]]]],'507' => [507,[[7],[8]]]};

=cut

my $all_subtrees = {
0 => [0, [[1], [2]]],
};

my $data = {
0 => {node => 'EOS'},
1 => {node => 'label', word => 'HELP'},
2 => {node => '.$', word => '!'},
};

say Dumper $self->translate_subtrees($all_subtrees, $data);

}


=head2 translate_subtrees( $all_subtrees, $data )

e.g.
my $all_subtrees = {
0 => [0, [[1],[2]]],
};

my $data = {
0 => {node => 'EOS'},
1 => {node => 'label', word => 'HELP'},
2 => {node => 'label' => '.$', word => '!'},
};

result:
my $trans = {
0 => ['EOS' [['label', 'HELP'], ['.$', '!']]]
};

=cut

sub translate_subtrees {
my $self = shift;
my $all_subtrees = shift;
my $data = shift;

my %translated = ();

while( my ($id, $subtree) = each %{$all_subtrees} ) {
my $subtree_flat = $self->flatten_array($subtree);
$subtree_flat =~ s/(.*[^0-9])([0-9])+([^0-9].*)/$1 ($2 >= 500 ? $data->{$2}->{node} : $data->{$2}->{node} . ' ' . $data->{$2}->{word} ) $3/g;
$translated{$id} = $subtree_flat;
}

return \%translated;
} # /translate_subtrees


=head2 flatten_array( $array_ref )

=cut

sub flatten_array {
my $self = shift;
my $a_ref = shift;

$Data::Dumper::Indent = 0;
my $flat = Dumper($a_ref);
$Data::Dumper::Indent = 2; # reset2new

return $flat;
} # /flatten_array

1;

use strict;
use warnings;

my $app = Test->new();
$app->run();


Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Gast Gast
 2008-04-02 08:04
#107724 #107724
Code (perl): (dl )
$s =~ s/(.*[^0-9])([0-9])+([^0-9].*)/"$1 ".($2 >= 500 ? $data->{$2}->{node} : $data->{$2}->{node} . ' ' . $data->{$2}->{word} )." $3"/ge;


Option "e" Dann wird er Ersetzungsteil als Code ausgeführt und das Ergebnis in $_ als Ersetzung benutzt.
pktm
 2008-04-04 01:52
#107848 #107848
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja toll!
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 3 Einträge, 1 Seite



View all threads created 2008-04-02 05:07.