Perl的。访问调用者参数(如shift,pop等)

时间:2015-03-02 07:20:41

标签: perl

在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必须作用于@_,在这种情况下对其余的参数起作用,没有第一个因为它被移位(实际上我只需要读取参数,而不是做改变。)

1 个答案:

答案 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)调用& - 然后函数获取调用函数的参数作为它的输入。

但是我不接受这个自我回答,因为我仍然感兴趣,如果没有那个&符号魔法可以做到这一点,如果我需要传递其他参数并同时访问调用函数参数,等