Shouldn't that *.** be *.*? *to avoid having it consume everything?
On Sun, Dec 23, 2012 at 10:01 AM, Ken Slater <kenslate...@gmail.com> wrote: > On Sun, Dec 23, 2012 at 8:27 AM, punit jain <contactpunitj...@gmail.com> > wrote: > > Hi, > > > > I am doing grouping but seeing some weird behavior :- > > > > the strings in a file are like :- > > AccessModes = > > > (18,Mail,POP,IMAP,PWD,WebMail,WebSite,Relay,Mobile,FTP,MAPI,TLS,LDAP,WebCAL); > > .... > > ... > > . > > multiple lines > > > > I am seeing which lines have both POP and Webmail as below :- > > > > if( $line =~ /AccessModes\s*=\s*.*(WebMail)*.*(POP).*(WebMail)*.*/ ) { > > if(defined $2) { > > print "$2 $1"."$line"."\n"; > > } > > } > > > > > > However I get these below :- > > > > POPUse of uninitialized value in concatenation (.) or string at > > test.plline 283, <GEN85> line 2. > > POPUse of uninitialized value in concatenation (.) or string at > > test.plline 283, <GEN86> line 2. > > POPUse of uninitialized value in concatenation (.) or string at > > test.plline 283, <GEN87> line 2. > > > > Any clue why ? > > > > Regards. > > Hi, > Your basic mistake is making the WebMail strings you are searching for > optional by having an asterisk (*) following them. This means zero or > more instances of the strings. Thus once it matches POP, it is quite > happy to match zero instances of WebMail. I included some code below > to demonstrate: > > use strict; > use warnings; > use Data::Dumper; > > my @regExps = ( > # Original > qr/AccessModes\s*=\s*.*(WebMail)*.*(POP).*(WebMail)*.*/, > # Here we make the second WebMail non-optional > (removed following *) > # so it will match POP with a WebMail later on the line > qr/AccessModes #literal match > \s* # optionasl whitespace > = # literal equal sign > \s* # optional whitespace > .* # match as many characters > (WebMail)* # literal WebMail, but this is optional > # Therefore, it is skipped if POP is found > first > .* # match as many characters as we can > (POP) # match literal POP > .* # match as many characters as we can > # until we see WebMail > (WebMail) # match literal WebMail > /x, > # Make the matches non-optional and check for both strings > # at the same time using 'or' (|). > # This is probably the method you want to use. > qr/AccessModes #literal match > \s* # optionasl whitespace > = # literal equal sign > \s* # optional whitespace > .* # match as many characters as we can > # until we find WebMail or POP > (WebMail|POP) # literal WebMail or POP > .* # match as many characters as we can > # non-greedily, so it will match second > # occurence > (WebMail|POP) # literal WebMail or POP > /x > ); > > while (my $line = <DATA>) { > print $line; > for my $re ( @regExps ) { > print " RE: $re\n"; > if( $line =~ /$re/) { > print " 1: >$1<\n" if defined($1); > print " 2: >$2<\n" if defined($2); > print " 3: >$3<\n" if defined($3); > } > } > } > > __DATA__ > AccessModes = (POP); > AccessModes = > (18,Mail,POP,IMAP,PWD,WebMail,WebSite,Relay,Mobile,FTP,MAPI,TLS,LDAP,WebCAL); > AccessModes = > (18,Mail,IMAP,PWD,WebMail,WebSite,POP,Relay,Mobile,FTP,MAPI,TLS,LDAP,WebCAL); > > > HTH, Ken > > -- > To unsubscribe, e-mail: beginners-unsubscr...@perl.org > For additional commands, e-mail: beginners-h...@perl.org > http://learn.perl.org/ > > > -- Danny Gratzer