in reply to Flattening out arguments to splice

#!/usr/bin/perl use 5.14.0; use strict; use warnings; sub my_splice_like_func { my ($list, $offset, $length) = @_; my @copy = @$list; return splice @copy, $offset // 0, $length // @copy - $offset; } $, = ' '; # just keepin' it pretty my $list = [qw< one two three four >]; say my_splice_like_func($list, 2); # want "three four"; get "two +three four" say my_splice_like_func($list, 2, -1); # want "three"; get "three fou +r"

Replies are listed 'Best First'.
Re^2: Flattening out arguments to splice
by jwkrahn (Abbot) on May 30, 2018 at 00:34 UTC
    splice ARRAY,OFFSET,LENGTH,LIST

    You forgot the fourth argument: 'LIST'.

    my ($list, $offset, $length, @list) = @_;

      New splicer function operates on external referent (although I'm not sure what this gets you: it's almost exactly like splice) (update: needs Perl 5.10+ for // operator):

      c:\@Work\Perl\monks>perl -wMstrict -MData::Dump -le "use 5.010; ;; sub my_splicer { my ($ar, $offset, $len, @list) = @_; $offset //= 0; $len //= @$ar - $offset; return splice @$ar, $offset, $len, @list; } ;; use constant TEST => qw(one two three four five six seven eight); ;; my $ar; my @spl; my @args; ;; $ar = [ TEST ]; @args = (); @spl = my_splicer($ar, @args); dd \@spl, $ar; ;; $ar = [ TEST ]; @args = (2); @spl = my_splicer($ar, @args); dd \@spl, $ar; ;; $ar = [ TEST ]; @args = (2, 3); @spl = my_splicer($ar, @args); dd \@spl, $ar; ;; $ar = [ TEST ]; @args = (2, 3, qw(FOO BAR)); @spl = my_splicer($ar, @args); dd \@spl, $ar; " ( ["one", "two", "three", "four", "five", "six", "seven", "eight"], [], ) ( ["three", "four", "five", "six", "seven", "eight"], ["one", "two"], ) ( ["three", "four", "five"], ["one", "two", "six", "seven", "eight"], ) ( ["three", "four", "five"], ["one", "two", "FOO", "BAR", "six", "seven", "eight"], )

      Update: Note this code will also work as expected with something like
         @args = ($ar, 2, 3, qw(FOO BAR));
         @spl = my_splicer(@args);


      Give a man a fish:  <%-{-{-{-<

      I haven't tested this, but I believe that in tybalt89's code (and in your OP code), because the splice is operating on a copy of the  $list array reference argument, so a fourth argument  LIST would be assigned to the lexical array  @copy and then almost immediately lost along with that array.

      Do you mean that you want your function to operate on the external referent of the  $list array reference?


      Give a man a fish:  <%-{-{-{-<