in reply to Extract a specific number of words from a string

I note that your expected output retains the trailing space after the third word. If that was intentional then you could use a regular expression that uses zero-width look-around assertions to match the starting position of each word, recording them in an array using pos. You can then use substr to pull out everything up to the start of the first word you wish to discard.

johngg@shiraz:~/perl/Monks > perl -Mstrict -Mwarnings -E ' my @strs = ( q{Mary had a little lamb}, q{ its fleece was white as snow}, ); my $nWords = 3; my $qrWordStart = qr{(?x) (?: (?<= \A ) | (?<= \W ) ) # Preceded by either beginning of # string or non-word character (?= \w ) # Followed by a word character }; foreach my $str ( @strs ) { my @posns; push @posns, pos $str while $str =~ m{$qrWordStart}g; say qq{->@{ [ substr $str, 0, $posns[ $nWords ] ] }<-}; }' ->Mary had a <- -> its fleece was <-

I hope this is of interest.

Update: Added information about using look-arounds and commented the regex accordingly.

Cheers,

JohnGG