use re 'debug'; my $str = "abc"; $str =~ m/.|$/g for 1..5; __END__ Compiling REx ".|$" Final program: 1: BRANCH (3) 2: REG_ANY (5) 3: BRANCH (FAIL) 4: SEOL (5) 5: END (0) minlen 0 Matching REx ".|$" against "abc" 0 <> | 0| 1:BRANCH(3) 0 <> | 1| 2:REG_ANY(5) 1 | 1| 5:END(0) Match successful! Matching REx ".|$" against "bc" 1 | 0| 1:BRANCH(3) 1 | 1| 2:REG_ANY(5) 2 | 1| 5:END(0) Match successful! Matching REx ".|$" against "c" 2 | 0| 1:BRANCH(3) 2 | 1| 2:REG_ANY(5) 3 <> | 1| 5:END(0) Match successful! Matching REx ".|$" against "" 3 <> | 0| 1:BRANCH(3) 3 <> | 1| 2:REG_ANY(5) | 1| failed... 3 <> | 0| 3:BRANCH(5) 3 <> | 1| 4:SEOL(5) 3 <> | 1| 5:END(0) Match successful! Matching REx ".|$" against "" 3 <> | 0| 1:BRANCH(3) 3 <> | 1| 2:REG_ANY(5) | 1| failed... 3 <> | 0| 3:BRANCH(5) 3 <> | 1| 4:SEOL(5) 3 <> | 1| 5:END(0) END: Match possible, but length=0 is smaller than requested=1, failing! | 0| BRANCH failed... Match failed Freeing REx: ".|$" #### my $str = "abc"; print $str =~ m/(.)|$/g ? "matched! ".($1//'$') : 'no match', "\n" for 1..5; __END__ matched! a matched! b matched! c matched! $ no match