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/