On 7/1/07, alok nath <[EMAIL PROTECTED]> wrote:

Hi Chas,
  Can you please explain the portion ( ([\w ]*\w)\s*= )of the regex.?
  And why its stored in $s.Can it be directly stored in hash my %rec.
Thanks
Alok
snip

First off, the results of the regex are not being stored in $s; the
regex is being applied to the string in $s.  Therefore the results are
being stored directly into %rec.

As to what the regex does, whenever one runs up against a regex that
you don't understand, it is wise to break the regex into its simplest
parts and analyze how those parts interact with the input.  The
following script outputs

\s*:    [ ]
[\w ]*: [Test Descriptio]
\w:     [n]
\s*:    [ ]
=:      [=]
\s*:    [ ]
":      ["]
.*?:    [Test 1]
":      ["]

\s*:    [  ]
[\w ]*: [I]
\w:     [D]
\s*:    [  ]
=:      [=]
\s*:    [  ]
":      ["]
.*?:    [ID A1]
":      ["]

\s*:    [ ]
[\w ]*: [DirAbsolut]
\w:     [e]
\s*:    [ ]
=:      [=]
\s*:    [ ]
":      ["]
.*?:    [C:/perl]
":      ["]

We can see from this that the pattern [\w ]*\w holds the key and the
pattern .*? holds the value.  Also we can see that the whitespace
patterns match the whitespace characters and the constants match the
constants.  One might reasonably ask why we are using  [\w ]*\w
instead of just [\w ]+ since \w is part of the character class.  here
is the what the output would look like if we did that:

\s*:    [ ]
[\w ]+: [Test Description ]
\s*:    [ ]
=:      [=]
\s*:    [ ]
":      ["]
.*?:    [Test 1]
":      ["]

\s*:    [  ]
[\w ]+: [ID ]
\s*:    [  ]
=:      [=]
\s*:    [  ]
":      ["]
.*?:    [ID A1]
":      ["]

\s*:    [ ]
[\w ]+: [DirAbsolute ]
\s*:    [ ]
=:      [=]
\s*:    [ ]
":      ["]
.*?:    [C:/perl]
":      ["]

Ah-ha, it appears as if [\w ]+ matches the space after the key and the
\s* is matching nothing.  This might cause a problem if we are
expecting to have "DirAbsolute" rather than "DirAbsolute ".

#!/usr/bin/perl

use strict;
use warnings;

#strings to test
my @a = (
       '<Test Description = "Test 1" ',
       'ID =  "ID A1" ',
       'DirAbsolute = "C:/perl"/>',
);

#regex broken down into individual parts
my @parts = (
       q(\s*),
       q([\w ]*),
       q(\w),
       q(\s*),
       q(=),
       q(\s*),
       q("),
       q(.*?),
       q(")
);

my $regex = join '', map { "($_)" } @parts;

for my $s (@a) {
       my %h;
       @[EMAIL PROTECTED] = $s =~ /$regex/;
       print  "\n", map { "$_:\t[$h{$_}]\n" } @parts;
}

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to