User since
2004-08-15
19
Artikel
BenutzerIn
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
User since
2003-08-21
2614
Artikel
ModeratorIn
Vielleicht einfach mit $1, wenn Du den Ausdruck einklammerst.
User since
2004-08-15
19
Artikel
BenutzerIn
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.
User since
2006-01-27
3890
Artikel
HausmeisterIn
Meinst Du sowas?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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!
User since
2003-08-21
2614
Artikel
ModeratorIn
Oder meinst Du sowas hier:
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.
User since
2004-08-15
19
Artikel
BenutzerIn
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