> -----Original Message-----
> From: Dan Finch [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, July 17, 2002 12:03 PM
> To: [EMAIL PROTECTED]
> Subject: Pattern Matching
> 
> 
> I'm working on a script that I need to use some pattern 
> matching in.  I've
> got a couple books that I have been reading about it and 
> thought I knew how
> to seach for what I'm after but its just not working.
> 
> Here is a test script I've been playing with to get this 
> working.  I want to
> be able to parse out of the string any one of the 
> 'letter=values'.  The way
> I'm trying to get this to work is by searching for the Letter of the
> parameter I'm searching for follow by the =.  Then I add a .* 
> which matches
> anything.  Then I want to match to end with a '
> 
> But no matter what I've tried I will never find the '  It 
> find the beginning
> of my search then go to the end of the string.  I've played 
> with escaping
> the ' but that didnt seem to work either.
> 
> What I end up having to do to get it to work is end the seach with the
> Letter= of the next variable in the string and then clean it 
> up but I really
> don't want to have to do it that way as its not very flexable 
> and relies on
> the string being in a certain order and I don't want to count on that.
> 
> If anyone has an idea about what I'm doing wrong I would be 
> most grateful.
> 
> 
> 
> #!/usr/bin/perl
> 
> $test = "'A=test' 'P=lkjae' 'p=12' 'H=goober@localhost' 'n=crfrinch'
> 't=3453462'";

There's a subtle bug here that "use strict" would catch. The "@localhost"
is silently being expanded to the contents of the array @localhost, since
you are using double quotes. Since this array doesn't exist, this is
expanding to an empty string, i.e. 'H=goober'.

Adding "use strict" flags the error, because you did not declare an array
called "@localhost".

To avoid the expansion, you need to escape the @ sign or use the q[]
quoting construct:

use strict;
my $test = "'A=test' 'P=lkjae' 'p=12' 'H=goober\@localhost' 'n=crfrinch'
't=3453462'";

or,

use strict;
my $test = q['A=test' 'P=lkjae' 'p=12' 'H=goober@localhost' 'n=crfrinch'
't=3453462'];

> $_ = $test;
> /(n=.*')/;

The * is "greedy", which means it will match the *longest* sequence
up to a "'" char. This will match the string:

   n=crfrinch' 't=3453462'
                         ^ this is last "'" that can be matched

> $username = $1;

This is bad, because $1 will not be changed if the regex did not match.
Never use $1 without checking that the regex succeeded.

> print "$1\n";

Here's an example that will print all the pairs:

   #!/usr/bin/perl
   use strict;
   my $test = q['A=test' 'P=lkjae' 'p=12' 'H=goober@localhost' 'n=crfrinch'
't=3453462'];
   print "$1 => $2\n" while ($test =~ /'(.*?)=(.*?)'/g);

   output:
   A => test
   P => lkjae
   p => 12
   H => goober@localhost
   n => crfrinch
   t => 3453462

The .*? construct is the "non-greedy" version of .* and matches the
*shortest* possible string (i.e. up to the *first* occurrence of the
next token).

The /g modifier is used when matching in a loop, to cause the match to
start from where the last match ended.

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to