| 333 | === each の罠 === |
| 334 | * パッと見,以下のコードでは {{{===unreachable===}}} は出力されないように見える. |
| 335 | * しかし,1 度目の {{{dump}}} コールにより {{{$data}}} のイテレータが {{{$vv->{'uge'}}}} を過ぎた状態で保存されるため,2 度目の {{{dump}}} コールでは該当コードに到達する. |
| 336 | * each を使う際は最後までイテレートさせないとハマる危険性大. |
| 337 | {{{ |
| 338 | #!perl |
| 339 | use YAML::Syck qw(Load Dump); |
| 340 | |
| 341 | &hoge(); |
| 342 | |
| 343 | sub hoge { |
| 344 | my $data = Load( join( '', <DATA> ) ); |
| 345 | &dump($data); |
| 346 | &dump($data); |
| 347 | } |
| 348 | |
| 349 | sub dump { |
| 350 | my $data = shift; |
| 351 | while ( my ( $k, $v ) = each( %{$data} ) ) { |
| 352 | foreach my $vv ( @{$v} ) { |
| 353 | return if ( $vv->{'uge'} eq 'uhi-' ); |
| 354 | } |
| 355 | } |
| 356 | print "=== unreachable ===\n"; |
| 357 | print Dump($data); |
| 358 | } |
| 359 | |
| 360 | __DATA__ |
| 361 | hoge: |
| 362 | - hage: hige |
| 363 | huge: unko |
| 364 | uge: goge |
| 365 | - hage: hihi |
| 366 | huge: uho |
| 367 | uge: uhi- |
| 368 | }}} |
| 369 | {{{ |
| 370 | #!sh |
| 371 | $ perl hogehoge.pl |
| 372 | === unreachable === |
| 373 | --- |
| 374 | hoge: |
| 375 | - |
| 376 | hage: hige |
| 377 | huge: unko |
| 378 | uge: goge |
| 379 | - |
| 380 | hage: hihi |
| 381 | huge: uho |
| 382 | uge: uhi- |
| 383 | }}} |
| 384 | * なお,{{{keys}}} や {{{values}}} を利用することでイテレータを初期化することができる. |
| 385 | * 上記コードのうち,{{{hoge}}} 関数内の 2 連 {{{dump}}} の間に {{{keys(%{$data});}}} を挿入するだけで実行結果が変化することに注目. |
| 386 | |