Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: position of first matching regex

by GrandFather (Saint)
on May 16, 2014 at 23:52 UTC ( [id://1086406]=note: print w/replies, xml ) Need Help??


in reply to position of first matching regex

The special variable @- is an array that contains the offsets from the start of the string to each match. Consider:

use strict; use warnings; for my $str ('1 2 3', 'a b c', ' a3 b2 c1') { next if $str !~ /\w?([0-9])/; my $mpos = $-[0]; my $cpos = $-[1]; print "Found $1 in '$str' at index $cpos. Overall match started at + $mpos\n"; }

$-[0] accesses the first element of the array - the start of the entire match. $-[1] gives the index of the start of the first capture. The script prints:

Found 1 in '1 2 3' at index 0. Overall match started at 0 Found 3 in ' a3 b2 c1' at index 2. Overall match started at 1

See the perlvar regular expression variables section. You should take a look at perlretut and perlre too.

Perl is the programming world's equivalent of English

Replies are listed 'Best First'.
Re^2: position of first matching regex
by techtaskers.com (Novice) on May 17, 2014 at 14:48 UTC

    Yup! There's one of those obvious things I feared: Duh??? ``@'' is an "array" sigil. Wow. I love learning, and it is usually quit a laugh too. Like this time.

    Nice code! I'm still used to c, just learning perl, and spontaneous variable declarations seem soooo immoral! Just habit. Also, the next if $str !~ /\w?([0-9])/; type of code is still new to me.

    I am assuming that the $- values are keying on the positional declaration within the re. And unlike pos, it does not require m/.../g ?

    Changed this to:

    if ( $filename =~ /([0-9])/ ) { ($startloc = $-[0]); ($alphaloc = $startloc + 4); } print "$startloc$alphaloc ";

    The &&'d failed to set $alphaloc if $startloc was zero. (More hilarity!) A case of trying to be clever, instead of being clever.

    Which now works. Perhaps before I die, I'll remember that perl's arrays are scalar references. Perhaps not.

    Thank you for your help. This now works, and I can get this done.


    David

      Why print if the match fails?

      Note that my code includes strictures (use strict; use warnings;). That will warn you of such unhealthy coding practises. I strongly recommend you use strictures, especially if you are just starting out with Perl.

      The () around your two assignment statements don't add any value and make understanding the intent of your code harder.

      @array is not a scalar reference. It is the array.

      Perl is the programming world's equivalent of English

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (2)
As of 2024-04-20 05:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found