perl子例程参数列表 - “通过别名”?

时间:2013-05-28 03:56:46

标签: perl parameters arguments pass-by-reference subroutine

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

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

我一直都知道Perl参数是通过值传递的,所以每当我需要传入一个大型结构,或传入一个变量进行更新时,我都会传递一个参考。

在perldoc中读取精细打印,然而,我已经了解到@_由别名组成了参数列表中提到的变量。在阅读下一位数据后, getline()会返回 $ _ [0] = $ data; ,直接存储 $ data 进入 $ line

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

最简单的方法可能只是使用循环,因为循环将其参数别名为名称;即。

sub my_sub {
  for my $arg ( $_[0] ) {
    code here sees $arg as an alias for $_[0]
  }
}

答案 2 :(得分:0)

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

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

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