在perl中,如果没有提供参数,则shift
函数可以作用于@_
(调用它的作用域中的函数的参数)。
我可以在perl中编写一个具有相同行为的自定义函数(某种my_shift)吗?
我试过了:
use Data::Dumper;
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;
print "Self: $self.\n";
print Dumper(get_caller_args()), "\n";
}
它有点工作,但是
test(1,2,3)
输出:
Self: 1.
$VAR1 = [
1,
2,
3
];
所以它没有看到shift
所做的更改(虽然它可以看到pop
所做的更改)。
但我希望它的行为如下:
sub test {
my $self = shift;
print my_function;
}
这里没有参数调用的my_function
必须作用于@_
,在这种情况下对其余的参数起作用,没有第一个因为它被移位(实际上我只需要读取参数,而不是做改变。)
答案 0 :(得分:1)
好的,我找到了答案:
use feature 'say';
sub my_shift {
say "Arguments before shift: ", @_;
shift;
say "Arguments after shift: ", @_;
}
sub test {
say "Arguments before my_shift: ", @_;
&my_shift;
say "Arguments after my_shift: ", @_;
}
这里的“棘手”问题是在函数名称之前用&符号(my_shift
)调用&
- 然后函数获取调用函数的参数作为它的输入。
但是我不接受这个自我回答,因为我仍然感兴趣,如果没有那个&符号魔法可以做到这一点,如果我需要传递其他参数并同时访问调用函数参数,等