7

我只是难以置信地看着这个序列:

my $line;
$rc = getline($line); # read next line and store in $line

我一直都明白 Perl 参数是按值传递的,所以每当我需要传递一个大型结构或传递一个要更新的变量时,我都会传递一个 ref。

然而,阅读 perldoc 中的细则,我了解到@_ 是由参数列表中提到的变量的别名组成的。读取下一位数据后,getline()以$_[0] = $data;的形式返回它。,它将$data直接存储到$line中。

我确实喜欢这个——就像在 C++ 中通过引用传递一样。但是,我还没有找到一种方法来为$_[0]分配一个更有意义的名称。有没有?

4

3 回答 3

7

你可以,它不是很漂亮:

use strict;
use warnings;

sub inc {
  # manipulate the local symbol table 
  # to refer to the alias by $name
  our $name; local *name = \$_[0];

  # $name is an alias to first argument
  $name++;
}

my $x = 1;
inc($x);
print $x; # 2
于 2013-05-28T04:04:20.237 回答
0

最简单的方法可能只是使用循环,因为循环将它们的参数别名为一个名称;IE

sub my_sub {
  for my $arg ( $_[0] ) {
    code here sees $arg as an alias for $_[0]
  }
}
于 2013-05-29T00:43:37.247 回答
0

@Steve 的代码版本允许多个不同的参数:

sub my_sub {
  SUB:
  for my $thisarg ( $_[0] ) {
    for my $thatarg ($_[1]) {
      code here sees $thisarg and $thatarg as aliases 
      last SUB;
    }
  }
}

当然,这会带来多级嵌套及其自身的代码可读性问题,因此只有在绝对必要时才使用它。

于 2013-06-27T12:47:17.510 回答