Schrift
[thread]8676[/thread]

Regex: Match: Variable für $* setzen



<< >> 4 Einträge, 1 Seite
supersucker
 2007-01-24 10:56
#73548 #73548
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin sicher ihr kennt das Problem und habt (hoffentlich) eine Lösung dafür, weder google noch Forensuche haben etwas ergeben.

Folgende Situation:

Ich habe in einem grösseren Script ganz oben eine (der Einfachheit halber) regex definiert.
Diese verwende ich nun mehrmals im script.
Bei dieser Regex soll immer der gleiche Teil verwendet werden, also z.B. so:



Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $regex = qr/(foo)(bar)(foo)/

# mehr Code

if($bla =~ m/$regex/)
print $2;

# mehr Code

if($blub =~ m/$regex/)
print $2;


Das Dumme ist nun natürlich:

Ändere ich meine Regex ganz oben, muss ich im kompletten Code auch die "$2" entsprechend anpassen, was ja nicht Sinn der Sache sein kann...

Nur wie ich das ganz oben definieren?

Mit anderen Worten, was muss ich tun damit ich sowas

Code: (dl )
1
2
3
4
5
6
7
my $regex = qr/(foo)(bar)(foo)/
my $hit = $2; # geht natürlich nicht

# mehr Code

if($bla =~ m/$regex/)
print $hit;


machen kann?

Danke für jeden Tip!
renee
 2007-01-24 11:01
#73549 #73549
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So würde es gehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

my $regex = qr/(foo)(bar)(foo)/;
my $hit = 2; # geht natürlich nicht

# mehr Code
my $bla = "foobarfoo";

if($bla =~ m/$regex/){
no strict 'refs';
print ${$hit};
}


Oder ohne mit strict in Konflikt zu geraten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use strict;
use warnings;

my $regex = qr/(foo)(bar)(foo)/;
my $hit = 2; # geht natürlich nicht

# mehr Code
my $bla = "foobarfoo";

if(my @array = $bla =~ m/$regex/){
print $array[$hit-1];
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
supersucker
 2007-01-24 11:55
#73550 #73550
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Danke Renee,

klappt alles, ich hab mich für deine erste Lösung entschieden....
sid burn
 2007-01-24 14:26
#73551 #73551
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Naja,
dass was du eigentlich möchtest sind benannte Klammerausdrücke.
Sprich du willst den Wert von Klammern nicht in $1, $2 etc. speichern, sondern in einer benannten Variablen. Sowas lässt sich auch mit Perl erledigen.

Code: (dl )
1
2
3
4
5
6
7
my $string = 'foobarfoo';
{
my $hit;
my $regex = qr/(foo)(bar)(?{ $hit = $^N })(foo)/;

print $hit if $string =~ m/$regex/;
}


Du musst dir nur zur Nutze machen das du mit (?{ ... }) Perl Code in einer Regex ausführen kannst. Weiterhin enthält die Spezialvariable $^N immer den Wert der zuletzt schließenden Klammer.

Die Klammer der du also einen Direkten Variablennamen zuweisen möchtest, dahinter machst du dann einfach das obrige Konstrukt.

Nun kannst du deine Regex verändern wie du Lustig bist. Hauptsache $hit wird gesetzt auf das was du haben möchtest.\n\n

<!--EDIT|sid burn|1169641667-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< >> 4 Einträge, 1 Seite



View all threads created 2007-01-24 10:56.