Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked

Re^2: regex for multiple capture within boundary

by johngg (Canon)
on Jul 16, 2006 at 22:14 UTC ( #561607=note: print w/replies, xml ) Need Help??

in reply to Re: regex for multiple capture within boundary
in thread regex for multiple capture within boundary

I think I understand what is going on in the first of your updated solutions but if I change it to read

my @nums = ($x =~ /\s(\S+)/)[1] =~ /(\d+)/g;

expecting output of

3 33

it doesn't work unless I also make the first match global like this

my @nums = ($x =~ /\s(\S+)/g)[1] =~ /(\d+)/g;

I think this is because the round brackets around the match put the match into list context and the [0] subscript grabs the first elements of the match; however, since the match is non-global there will only ever be one element in the list and trying to get more will not work. If we want a second or subsequent element we must make the match global to capture more than one element.

Have I understood this correctly or am I completely missing the point?



Replies are listed 'Best First'.
Re^3: regex for multiple capture within boundary
by ikegami (Patriarch) on Jul 17, 2006 at 01:28 UTC

    That's exactly it (although there could be 0 elements if the match fails).

    my @nums = ($x =~ /\s(\S+)/)[0] =~ /(\d+)/g;
    could also be written as
    my @nums = ($x =~ /\s(\S+)/ ? $1 : undef) =~ /(\d+)/g;

    If you're going to use /g, drop the \s:

    # @nums = ('3', '33'); my $word = 2; my @nums = ($x =~ /(\S+)/g)[$word] =~ /(\d+)/g;

    or use split:

    # @nums = ('3', '33'); my $word = 2; my @nums = (split(' ', $x))[$word] =~ /(\d+)/g;

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://561607]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (3)
As of 2022-11-27 01:22 GMT
Find Nodes?
    Voting Booth?