gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:54:00 24 4
gpt4 key购买 nike

假设我有一个号码,$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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com