Ну вот есть в перле такая функция shift, которую если дёрнуть без аргументов берёт и сдвигает массив аргументов той функции внутри которой она была вызвана. Можно ли на перле написать функцию с подобным же поведением?
Иными словами нужно внутри функции получить ссылку/нессылку на аргументы вызывающей функции.
Можно сделать так:
sub get_caller_args (;$) {
my $n = shift;
$n = defined $n? $n:1;
my $ret;
package DB {
my($t,$t1) = caller($n);
};
$ret = \@DB::args;
return $ret;
}
Оно покажет аргументы вызывающей функции, но проблема в том, что оно никак не отреагирует, если эргументы уже были сдвинуты.
Пример:
sub test ($@) {
my $self = shift;
use Data::Dumper;
print "Self: $self,\n", Dumper(get_caller_args()), "\n";
}
Ну и вызов test 1,2,3
вернет: Self: 1, $VAR1=[1,2,3]
, а надо так: Self: 1, $VAR1=[2,3]
;