$ perl -e '
> use strict;
> use warnings;
> my @in = split /\n/,
> "a 123
> a 125
> b 127
> a 129
> a 130
> b 131
> a 132
> b 133";
>
> my @a_buff;
> for (@in) {
> push @a_buff, $_ and next if /a/;
> my $aa = shift @a_buff; # avoid to use the $a special variable
> my $diff = $2 - $1 if "$aa - $_" =~ /(\d+)[^\d]*(\d+)/;
> print "$aa ; $_ => $diff\n";
> }
> '
a 123 ; b 127 => 4
a 125 ; b 131 => 6
a 129 ; b 133 => 4
####
use strict;
use warnings;
my $iter = create_iter();
while (my ($aa, $bb) = $iter->()) {
last unless defined $bb;
my $diff = $2 - $1 if "$aa $bb" =~ /(\d+)[^\d]*(\d+)/;
print "$aa ; $bb => $diff\n";
}
sub create_iter {
my @a_buff;
return sub {
while (){
chomp;
push @a_buff, $_ and next if /a/;
return shift @a_buff, $_;
}
}
}
__DATA__
a 123
a 125
b 127
a 129
a 130
b 131
a 132
b 133
####
$ perl iter_pairs.pl
a 123 ; b 127 => 4
a 125 ; b 131 => 6
a 129 ; b 133 => 4
####
use strict;
use warnings;
use feature "state";
while (my ($aa, $bb) = iter()) {
last unless defined $bb;
my $diff = $2 - $1 if "$aa $bb" =~ /(\d+)[^\d]*(\d+)/;
print "$aa ; $bb => $diff\n";
}
sub iter {
state @a_buff;
while (){
chomp;
push @a_buff, $_ and next if /a/;
return shift @a_buff, $_;
}
}
__DATA__
a 123
...