use List::Util qw/max reduce/; while(){ chomp; #-- Version 1 my $diff=""; while (/(\d)(\d)/g) { $diff.=($2-$1)%10; pos($_)--; } my $v1= 1 + max map { length } $diff =~ m/(1+|9+)/g; #--- Version 2 $diff=""; reduce { $diff.=($a-$b)%10; $b} split //; my $v2= 1 + max map { length } $diff =~ m/(1+|9+)/g; print "V1: $v1 V2: $v2 $_\n"; } __DATA__ 461771621368210983721913243963580233112903255149955120374576