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. 以下は対処方法の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 に答える