Schrift
[thread]9104[/thread]

regexp funktioniert erst beim zweiten Lauf (Seite 2)



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
dukeofnukem
 2007-06-20 16:50
#77687 #77687
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
Tatsache, die rexexp scheint bei jedem zweiten Aufruf undef zu sein oder false oder sonstwas. Erinnert mich an meinen "glob"-Fehler, aber das sollte doch hier anders sein oder?

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
#!/usr/bin/env perl

use strict;
use warnings;

my @files = @ARGV || glob "*.xml"
or die "No files specified!";

my %xmlstring = (
Hzbprtype => qr/<kBPrType[^>]*>\s*52\s*<\/kBPrType>/,
);

for my $file ( @files ) {
my @cont = do { local(*ARGV, $_, $/); @ARGV = $file; $/ = "</BaseProduct>"; <>; }
if ( -r $file );

for ( @cont ) {

if ( /$xmlstring{'Hzbprtype'}/gs ) {
print "\n$file\ncall #1";
}

if ( /$xmlstring{'Hzbprtype'}/gs ) {
print "\n$file\ncall #2";
}

if ( /$xmlstring{'Hzbprtype'}/gs ) {
print "\n$file\ncall #3";
}

if ( /$xmlstring{'Hzbprtype'}/gs ) {
print "\n$file\ncall #4";
}

if ( /$xmlstring{'Hzbprtype'}/gs ) {
print "\n$file\ncall #5";
}
}
}


Es werden call #1, #3 und #5 ausgeführt....
drum&bass is a state of mind
renee
 2007-06-20 16:50
#77688 #77688
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das hat eher was mit dem Zeiger zu tun, der intern bei RegEx's verwendet wird. Schau Dir mal die Debug-Ausgaben an wenn Du perl -Mre=debug skript.pl machst...
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/
dukeofnukem
 2007-06-20 17:12
#77689 #77689
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
So funktionierts:

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
#!/usr/bin/env perl

use strict;
use warnings;

my @files = @ARGV || glob "*.xml"
or die "No files specified!";

my %xmlstring = (
Hzbprtype => qr/<kBPrType[^>]*>\s*52\s*<\/kBPrType>/s,
);


for my $file ( @files ) {
my @cont = do { local(*ARGV, $_, $/); @ARGV = $file; $/ = "</BaseProduct>"; <>; }
if ( -r $file );

for ( @cont ) {

if ( /$xmlstring{'Hzbprtype'}/ ) {
print "\n$file\ncall #1";
}

if ( /$xmlstring{'Hzbprtype'}/ ) {
print "\n$file\ncall #2";
}

if ( /$xmlstring{'Hzbprtype'}/ ) {
print "\n$file\ncall #3";
}

if ( /$xmlstring{'Hzbprtype'}/ ) {
print "\n$file\ncall #4";
}

if ( /$xmlstring{'Hzbprtype'}/ ) {
print "\n$file\ncall #5";
}
}
}


Wenn man allerdings versucht die Regexp mit /g direkt in den hash zu compilen knallts ("Bareword found where operator expected [...]"). Wieso ist mir jetzt ehrlich gesagt nicht wirklich klar. Fände es schon interessant, aber für die interessanten Sachen will eh nie einer bezahlen ~:-/

Da ich /g nicht zwingend brauche da es eh nur um einen einzigen boolean match geht isses so auch noch sauberer.

*soifz* another mystery unsolved
drum&bass is a state of mind
betterworld
 2007-06-20 23:39
#77690 #77690
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Das ist eigentlich ganz klar... /g sorgt dafuer, dass alle Treffer nacheinander zurueckgegeben werden.  Wenn dann der letzte Treffer kam, wird nichts mehr zurueckgegeben.  Gedacht ist das primaer fuer Schleifen:
Code: (dl )
1
2
3
while ('test' =~ /./g) {
   print "$&\n";
}

Auch in diesem Code gibt der Regex irgendwann falsch zurueck, und zwar beim fuenften Mal (in Deinem Fall beim zweiten Mal).
Die Information wird hierbei im String gespeichert und nicht im Regex, daher funktioniert es auch ohne Schleife.  Wenn Du diese Funktionalitaet nicht benoetigst, macht es eh keinen Sinn, /g zu benutzen.  Normalerweise benutzt man das nur im Schleifenkopf oder im Listenkontext (oder bei s///g).

Zitat aus perlop:
Quote
In scalar context, each execution of "m//g" finds the next match,
              returning true if it matches, and false if there is no further
              match.
\n\n

<!--EDIT|betterworld|1182368693-->
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2007-06-20 13:23.