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

match-Anweisung mit strings als Suche: match-Operator

Leser: 1


<< >> 10 Einträge, 1 Seite
Duff
 2006-11-13 12:08
#71672 #71672
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe eine Frage zum match-Operator. Ich möchte den zu suchenden reg. Ausdruck in einer Variablen speichern und dann die Variable im match-Ausdruck verweden.

Ich habe z.B. folgende Subroutine:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
sub ausgabe {
my ($arrayRef)=@_;
foreach my $array ( @{$arrayRef} ) {
my @result=();
while ($array->[1] =~ /(<[^>]*?STRING[^>]*?>)(\d{10,15})<\/[^>]*?STRING[^>]*?>/igm) {
push @result, $1. " --> " .$2. "\t";
}
printf "%-90s : %-s\n", $array->[0], join(" ",@result);
}
}


die gerne in etwa so schreiben möchte (was aber nicht funktioniert. Der SUCH-String wird aber korrekt in der print-Anweisung zurück gegeben).
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub ausgabe {
my ($arrayRef)=@_;
my $suchstring = "/(<[^>]*?STRING[^>]*?>)(\\d{10,15})<\/[^>]*?STRING[^>]*?>/igm";
print "-- $suchstring --\n";
foreach my $array ( @{$arrayRef} ) {
my @result=();
while ($array->[1] =~ $suchstring) {
push @result, $1. " --> " .$2. "\t";
}
printf "%-90s : %-s\n", $array->[0], join(" ",@result);
}
}
D'OH
Daniel
Duff
 2006-11-13 12:11
#71673 #71673
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Sorry,

kann einer den doppelten Thread von mir löschen. Ich kann leider keinen Button zum DELETEN finden.

DANKE.
D'OH
Daniel
Taulmarill
 2006-11-13 12:14
#71674 #71674
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
du kannst reguläre ausdtrücke mit dem operator qr// "compilieren". das sieht dann in etwa so aus
Code: (dl )
my $suchstring = qr/(<[^>]*?STRING[^>]*?>)(\\d{10,15})<\/[^>]*?STRING[^>]*?>/igm;

benutzt wird das dann so
Code: (dl )
while ($array->[1] =~ /$suchstring/ ) { ......

sehe dazu auch http://perldoc.perl.org/perlret....essions\n\n

<!--EDIT|Taulmarill|1163415063-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Duff
 2006-11-13 12:39
#71675 #71675
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke für die Antwort.

Aber wenn ich nur ein qr davor schreibe bekomme ich einen Fehler:
Code: (dl )
Bareword found where operator expected


Wenn ich my $suchstring = qr!...!; schreibe, wird die match-Anweisung nicht ausgeführt. Beim print bekomme ich folgendes zurück:
Code: (dl )
-- (?-xism:/(<[^>]*?STRING[^>]*?>)(\d{10,15})</[^>]*?STRING[^>]*?>/igm) --
D'OH
Daniel
Taulmarill
 2006-11-13 12:50
#71676 #71676
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich hatte noch was übersehen. den schalter "g" am ende nicht beim regex sondern erst beim matchen mitgeben, da dieser nicht das verhalten des ausdrucks an sich sonder den des matchings verändert, also so:
Code: (dl )
1
2
my $suchstring = qr/(<[^>]*?STRING[^>]*?>)(\\d{10,15})<\/[^>]*?STRING[^>]*?>/im;
while ($array->[1] =~ /$suchstring/g ) {
\n\n

<!--EDIT|Taulmarill|1163415044-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Duff
 2006-11-13 12:59
#71677 #71677
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ja danke, super.

Das war's.

...da hätte ich noch lange gesucht und gelesen...
D'OH
Daniel
Duff
 2006-11-13 13:42
#71678 #71678
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Mmh... und schon gibt es das nächste Problem.

Möchte die ganze Subroutine nun mit zwei Parametern realisieren, so dass der erste übergebene Parameter der reg. Ausdruck sein soll.

Habe es so probiert, bekomme aber kein Ergebnis beim match-Aufruf:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub ausgabe {
my ($uebergabe)=shift @_;
my ($arrayRef)=@_;
my $suchstring = qr($uebergabe);
print "-- $suchstring -- \n";
foreach my $array ( @{$arrayRef} ) {
my @result=();
while ($array->[1] =~ /$suchstring/g) {
push @result, $1. " --> " .$2. "\t";
}
printf "%-90s : %-s\n", $array->[0], join(" ",@result);
}
}


Es folgen noch die beiden Ausgaben des reg. Ausdrucks.
Einmal, die Ausgabe der eingegebenen Variable des reg. Audrucks und zum Anderen die Ausgabe der print-Anweisung der Variablen $suchstring.
Code: (dl )
1
2
/(<[^>]*?STRING[^>]*?>)(\d{10,15})<\/[^>]*?STRING[^>]*?>/im
-- (?-xism:/(<[^>]*?STRING[^>]*?>)(\d{10,15})<\/[^>]*?STRING[^>]*?>/im) --
D'OH
Daniel
Duff
 2006-11-13 14:03
#71679 #71679
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ok, habe es jetzt so gelöst (ist zwar nicht so besonders, aber es funktioniert dann wenigstens die match-Anweisung).

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub ausgabe4 {
my ($uebergabe)=shift @_;
my ($arrayRef)=@_;
my $suchstring = qr/$uebergabe/im;
print "-- $suchstring -- \n";
foreach my $array ( @{$arrayRef} ) {
my @result=();
while ($array->[1] =~ /$suchstring/g) {
push @result, $1. " --> " .$2. "\t";
}
printf "%-90s : %-s\n", $array->[0], join(" ",@result);
}
}


Und der reg. Ausdruck, der an die Subroutine übergeben werden soll, muss dann so auferufen werden:

./skript.pl -r "(<[^>]*?STRING[^>]*?>)(\d{10,15})<\/[^>]*?STRING[^>]*?>", so dass die beiden // und die Endungen im (sowie g) entfallen müssen.
D'OH
Daniel
pq
 2006-11-13 15:01
#71680 #71680
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wenn du auf der kommandozeile regex-schalter festlegen willst, kannst du das ja tun,
nur eben nicht mit '/im', denn das gehoert zur perl-syntax.
./skript.pl -r "(?im:blabla)"
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Duff
 2006-11-13 17:28
#71681 #71681
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Quote
wenn du auf der kommandozeile regex-schalter festlegen willst, kannst du das ja tun,
nur eben nicht mit '/im', denn das gehoert zur perl-syntax.
./skript.pl -r "(?im:blabla)"


Ja danke, werde es mal ausprobieren.
D'OH
Daniel
<< >> 10 Einträge, 1 Seite



View all threads created 2006-11-13 12:08.