http://www.perlmonks.org?node_id=854170

# # @newlist = semijoin($expr, $itemcount, @list); # # $expr - A string to be used in a join() call. # $itemcount - The number of items in a list to be joined. # It may be negative. # @list - The list # # Create a new list by performing a join on I<$itemcount> elements at +a # time on the original list. Any leftover elements from the end of the # list become the last item of the new list, unless I<$itemcount> is # negative, in which case the first item of the new list is made from +the # leftover elements from the front of the list. # sub semijoin { my($jstr, $itemcount, @oldlist) = @_; my(@newlist); return @oldlist if ($itemcount <= 1 and $itemcount >= -1); if ($itemcount > 0) { push @newlist, join $jstr, splice(@oldlist, 0, $itemcount) while @oldlist; } else { $itemcount = -$itemcount; unshift @newlist, join $jstr, splice(@oldlist, -$itemcount, $i +temcount) while $itemcount <= @oldlist; unshift @newlist, join $jstr, splice( @oldlist, 0, $itemcount) if @oldlist; } return @newlist; }