use strict; use warnings; use diagnostics; our @found; # 0 1 2 3 4 5 # 012345678901234567890123456789012345678901234567890 my $string = q'abczdefzabcghijklzabczaerabrtyuabcethdauthabkudiabc'; # abc abc abc abc abc # 0 8 18 31 48 if( $string =~ m/ (.{3}) (?: .*? (\1) (?{ push @found, pos() - length($^N); }) )+ /x ) { print "$1: @found\n"; }