in reply to Subphrases from a phrase

I think the only changes I would make involve a few trivial simplifications:
sub list { my @words = split( /\s+/, $_[0] ); my $lastword = $#words; for my $i (1..$lastword) { push @words, map { join " ", @words[$_..$_+$i] } (0..$lastword +-$i); } return @words; }
Notes: (update: fixed  @_[0] --> $_[0] in first line of sub -- and this could just as well have been "shift".)