【发布时间】:2015-11-28 06:33:51
【问题描述】:
假设我有一个数字,$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}++];
}
如何修改标量引用的原始值?
【问题讨论】:
-
会指出-您实际上不需要做所有这些。你可以改为
my $letter = 'a'; print $letter++ for ( 1..10 ); -
即使我提供的答案符合您的要求,但我通常建议您避免做这样的事情。让循环索引“远距离”递增有点令人迷惑。
-
@Sobrique 我不敢相信这行得通,但这种行为甚至是documented。谢谢你今天教我一些新东西。
-
@MattJacob range operator 的工作方式相同,允许您执行
say for 'a' .. 'zz';之类的操作 -
@ThisSuitIsBlackNot 我知道那个,但我不认为增加一个字符串会起作用,更不用说产生一些令人满意的输出了。