As I understand your task (which seems to be different from BrowserUk), this should do it:
#!/usr/bin/perl -w
use strict;
my %hash = (a=>2, b=>1, c=>5, d=>3, e=>4);
my $input = "abcdaeec";
for (2, 3) {
print "n=$_: ";
my $n = $_ - 1;
my @sums;
while ( $input =~ /(.)(?=.{$n}(.))/g ) {
push @sums, $hash{$1} + $hash{$2};
}
print "@sums\n";
}
__END__
n=2: 7 4 7 7 6 9
n=3: 5 3 9 7 7
Update: let YAPE::Regex::Explain explain what the regex does:
use YAPE::Regex::Explain;
print YAPE::Regex::Explain->new( qr/(.)(?=.{1}(.))/ )->explain;
__END__
The regular expression:
(?-imsx:(.)(?=.{1}(.)))
matches as follows:
NODE EXPLANATION
----------------------------------------------------------------------
(?-imsx: group, but do not capture (case-sensitive)
(with ^ and $ matching normally) (with . not
matching \n) (matching whitespace and #
normally):
----------------------------------------------------------------------
( group and capture to \1:
----------------------------------------------------------------------
. any character except \n
----------------------------------------------------------------------
) end of \1
----------------------------------------------------------------------
(?= look ahead to see if there is:
----------------------------------------------------------------------
.{1} any character except \n (1 times)
----------------------------------------------------------------------
( group and capture to \2:
----------------------------------------------------------------------
. any character except \n
----------------------------------------------------------------------
) end of \2
----------------------------------------------------------------------
) end of look-ahead
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
And see perlop for what m//g does in scalar context (like the while (...) here). |