您可以执行以下操作:
my $hr = {start=>3, end=>20};
for my $i ($hr->{start}..$hr->{end}){
...
}
但是,如果您不想要$i
并且想要使用并增加$hr->{start}
值,该怎么办?以下内容不起作用:
for $hr->{start} ($hr->{start}..$hr->{end}){
...
}
以下是处理它的一种方法,但是有没有办法用迭代变量包含增量?
for ($hr->{start}..$hr->{end}){
...
$hr->{start}++;
}
使用c-for-loop的另一种方法:
for ( ; $hr->{start} <= $hr->{end} ; $hr->{start}++){
...
}
答案 0 :(得分:3)
Perl风格的for/foreach VAR (LIST)
构造不会做你想要的。索引变量必须是一个简单的标量。更重要的是,索引变量始终是本地化的,并且别名为LIST
中的项目,其含义在foreach
循环之外丢失。
my $foo = 42;
for $foo (1..10) {
...
}
print $foo; # 42
但在C风格的for
循环中,您可以使用表达式执行任何操作。
$hr = { start => 1 , end => 10 };
for ( ; $hr->{start} <= $hr->{end} ; $hr->{start}++ ) {
...
}
print $hr->{start}; # now it is 11
答案 1 :(得分:3)
循环结束时的增量:
for (; $hr->{start} <= $hr->{end}; ++$hr->{start}) {
...
}
循环开始时的增量:
while ($hr->{start}++ <= $hr->{end}) {
...
}
答案 2 :(得分:2)
嗯,你总是可以:
for ($hr->{start}..$hr->{end}){
$hr->{start} = $_;
...
}
基本上,如果你没有在变量前面加上“my”,perl会在循环变量前面隐藏一个隐含的“local”。既然你不能本地化一个引用(如果你考虑它就没有任何意义),你就不能使用引用作为迭代器。