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


In reply to Re: Extract a specific number of words from a string by johngg
in thread Extract a specific number of words from a string by author104

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.