0

您可以执行以下操作:

my $hr = {start=>3, end=>20};
for my $i ($hr->{start}..$hr->{end}){
   ... 
}

但是,如果您不想$i而是想要使用和增加$hr->{start}值怎么办?以下将不起作用:

for $hr->{start} ($hr->{start}..$hr->{end}){
   ... 
}

备择方案:

  1. 以下是处理它的一种方法,但是有没有办法将增量与迭代变量一起包含在内?

    for ($hr->{start}..$hr->{end}){
       ... 
       $hr->{start}++;
    }
    
  2. 使用 c-for-loop 的另一种方法:

    for ( ; $hr->{start} <= $hr->{end} ; $hr->{start}++){
       ... 
    }
    
4

3 回答 3

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
于 2012-04-26T20:41:19.477 回答
3

循环结束时递增:

for (; $hr->{start} <= $hr->{end}; ++$hr->{start}) {
   ... 
}

循环开始时的增量:

while ($hr->{start}++ <= $hr->{end}) {
   ... 
}
于 2012-04-26T20:42:19.163 回答
2

好吧,你总是可以:

for ($hr->{start}..$hr->{end}){
  $hr->{start} = $_;
  ...
}

基本上,如果你不在变量前面加上一个“my”,perl 就会在循环变量前面加上一个隐式的“local”。而且由于您无法本地化引用(如果您考虑一下,那将没有任何意义),因此您不能将引用用作迭代器。

于 2012-04-26T20:48:53.663 回答