perl - 是否可以在 Perl 中增加标量引用?

标签 perl pass-by-reference

假设我有一个号码,$x = 0;我想用子程序增加它,但子程序不会返回它的值:

sub increment {
    my ($var) = @_;

    my @list = (
        'a',
        'b',
        'c',

        ...

        'x',
        'y',
        'z'
    );

    return $list[$var++];
}

while ($x < 10) {
    print increment($x);
}

按原样,这将打印 aaaaaaaaaa永远代替 abcdefghij .如果我更换 increment($x)increment(\$x) ,它将标量地址转换为十进制数,然后将其递增。在上面的场景中,它最终会抛出一个错误,因为 25423331 或任何不是有效的数组元素。

如果 $x 是散列或数组中的一个元素,我可以将父元素作为引用传递来修改原始元素:
$x = {'val' => 0};
while ($x->{'val'} < 10) {
    print increment($x);
}

sub increment {
    ...
    return $list[$var->{$val}++];
}

如何修改标量引用的原始值?

最佳答案

您可以传递对要修改的变量的引用。

sub increment {
    my ($ref) = @_;
    ++$$ref;
}

my $i = 0;
say $i;  # prints 0
increment(\$i);
say $i;  # prints 1

您还可以利用 Perl passes by reference 的事实。 .
sub increment {
    ++$_[0];
}

my $i = 0;
say $i;  # prints 0
increment($i);
say $i;  # prints 1

但是这样隐藏增量是一个非常糟糕的主意。要么迭代一个列表,
for my $x ('a'..'z') {
   ...
}

或者写一个迭代器。
sub make_iter {
   my @list = 'a'..'z';
   return sub {
      return @list ? () : shift(@list);
   };
}

my $iter = make_iter();
while (my ($x) = $iter->()) {
   ...
}

关于perl - 是否可以在 Perl 中增加标量引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358436/

相关文章:

c# - 在属性中传递 ref 类型,C# 是按值传递还是 ref 传递

c# - 如何从 C# 扩展方法中访问 'this'?

perl - 在 perl 中从 DateTime 获取两位数的月份和日期

arrays - 解析数据并适应哈希给出了预期的结果

c++ - 防止将临时变量作为 const 引用传递的方法,该方法比删除 r 值重载更好地缩放

python - 在 Python 中通过引用传递整数

C# 字典值引用类型 - 请解释为什么会这样

perl - 如何在Perl中检查文件系统中一个路径是否存在于另一路径下?

perl - 在 Perl 中对文件名进行排序?

Perl 将值插入多维数组