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: <%-{-{-{-<
|