Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11508[/thread]

Frage zum "g" Modifizierer bei Substitutionen

Tags: Ähnliche Threads

Leser: 1


<< >> 6 Einträge, 1 Seite
Mikmak
 2008-03-22 17:12
#107366 #107366
User since
2004-08-15
19 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe eine Frage zu dem g Modifizierer.

Man nehme an ich habe folgenden Code:

my $text = " a b c d a b c d";
$text =~ s/a/aa/g;

Hier ist ja klar, das a durch aa ersetzt wird.

Falls ich jedoch einen Ausdruck schreiben will

$text =~ s/a/(Ausdruck)/ge;

würde es mich gerne mal interessieren wie ich an das Ergebnis des ersten durchlaufs kommen kann.

Erst wenn ich gegen Ende print $text eingebe, bekomme ich das ganze Ergebnis. Jedoch würde ich gerne das Zwischenergebnis des ganzen Strings bekommen. Also beim Match des 1. a. sozusagen das Ergebnis:

$text = " aa b c d a b c d";

Sinn und Zweck ist einfach das ich ein Tk Fenster schreibe, dass den User ermöglichen soll die Veränderung zu sehen. Also ein vorher und nachher Fenster, damit er dies bestätigen kann.

Ich weiß das der Operator g nur die Postion merkt, jedoch muss doch irgendwo gespeichert sein, von welcher position bis zu welcher position welcher String eingefügt werden soll.

Leider habe ich nichts gefunden, vielleicht hat einer von euch eine Idee

Gruß

Mikmak
betterworld
 2008-03-22 17:22
#107368 #107368
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Vielleicht einfach mit $1, wenn Du den Ausdruck einklammerst.
Mikmak
 2008-03-22 17:31
#107369 #107369
User since
2004-08-15
19 Artikel
BenutzerIn
[default_avatar]
Hi,
zuerst mal danke für deine rasche Antwort, jedoch wenn ich den Ausdruck einklammere und $ 1 bejutze, bekome ich nur den Patternmatch. Jedoch will ich auf das erste wie auch die folgenden Ergebnisse einzeln zugreifen.
Linuxer
 2008-03-22 17:55
#107371 #107371
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Meinst Du sowas?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
# vi: set ts=4 sw=4 sts=2 et:
use strict;
use warnings;


my $text = q~a b c d a b c d~;

$text =~ s/([ab])/&show_what($1)/ge;

print $text, $/;

sub show_what {
    my $match = shift;

    print "matched: $match", $/;
    return $match x 2;
}

__END__
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
betterworld
 2008-03-22 18:09
#107374 #107374
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Oder meinst Du sowas hier:
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
#!/usr/bin/perl
use strict;
use warnings;

my $text = ' a b c d a b c d hallo';

my $trace = $text;
my $offset = 0;

$text =~ s{(a)}{substitute($1)}ge;
print ">>$text\n";

sub substitute {
my ($vorher) = @_;

my $nachher = 'aa';

substr($trace, $offset + $-[0], length($vorher), $nachher);
print ">$trace\n";

$offset += length($nachher)-length($vorher);

return $nachher;
}


Ist ziemlich umstaendlich, weil es die Substition praktisch parallel in zwei Strings durchfuehrt. Aber es zeigt immer genau an, wie der String nach jeder Einzelersetzung aussieht.
Mikmak
 2008-03-22 21:30
#107379 #107379
User since
2004-08-15
19 Artikel
BenutzerIn
[default_avatar]
Danke für eure Antworten.
Das von Linuxer ist genau das, was ich gesucht habe. Vielen vielen Dank. Muss mal schauen wie ich das umsetzen werde.

Gruß Mikmak
<< >> 6 Einträge, 1 Seite



View all threads created 2008-03-22 17:12.