| | 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 | |