Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Re: match two elements from an array in a row

by dogz007 (Scribe)
on Aug 16, 2007 at 22:25 UTC ( #633186=note: print w/replies, xml ) Need Help??

in reply to match two elements from an array in a row

You could use List::Util and take advantage of reduce:

use strict; use List::Util qw(reduce); my @data = qw ( 01 b2 01 00 b6 81 81 01 b4 0a 01 01 01 01 00 01 00 00 01 00 c7 82 82 01 b2 01 00 b8 ); my $index; reduce { if ($a eq $b && $a =~ m/81|82/) { print "match $a starting at index $index\n"} $index++; $b; } @data;


match 81 starting at index 6 match 82 starting at index 22

Update: If you would prefer to use a for loop, you should use the range operator as below. Much cleaner to read. I guess I got carried away with the reduce.

for my $i (0 .. $#data) { if ( $data[$i] eq $data[$i+1] && $data[$i] =~ m/81|82/) { print "match $data[$i] starting at index $i\n"; } }

Replies are listed 'Best First'.
Re^2: match two elements from an array in a row
by Kanji (Parson) on Aug 17, 2007 at 01:45 UTC

    Perhaps premature optimization, but I'd recommend switching your tests around so that you only look for matches of numbers you care about:-

    if ($data[$i] =~ m/^(?:81|82)$/ && $data[$i] eq $data[$i+1]) {

    (Note the addition of anchors in the regex so you don't accidentally match a pair of, say, 181s.)

    And if the number of numbers you're trying to matches is likely to grow or change often, it may be easier using a hash instead of a regex:-

    my %wanted = map { $_, 1 } qw( 81 82 ); # ... for my $i (0 .. ($#data - 1)) { if (exists $wanted{$data[$i]} && $data[$i] eq $data[$i+1]) {


Log In?

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

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (6)
As of 2021-01-19 18:51 GMT
Find Nodes?
    Voting Booth?