Perl:有没有办法将hashref用作for循环迭代变量?

时间:2012-04-26 20:11:27

标签: perl loops

您可以执行以下操作:

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}++){
       ... 
    }
    

3 个答案:

答案 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”。既然你不能本地化一个引用(如果你考虑它就没有任何意义),你就不能使用引用作为迭代器。