Changes between Version 28 and Version 29 of Perl


Ignore:
Timestamp:
01/15/07 19:07:16 (18 years ago)
Author:
atzm
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Perl

    v28 v29  
    331331 * ([{a=>1, b=>2}, {a=>2, b=>3}, {a=>1, b=>3}], "a") が [{a=>1, b=>2}, {a=>2, b=>3}] で返る. 
    332332 
     333=== each の罠 === 
     334 * パッと見,以下のコードでは {{{===unreachable===}}} は出力されないように見える. 
     335   * しかし,1 度目の {{{dump}}} コールにより {{{$data}}} のイテレータが {{{$vv->{'uge'}}}} を過ぎた状態で保存されるため,2 度目の {{{dump}}} コールでは該当コードに到達する. 
     336   * each を使う際は最後までイテレートさせないとハマる危険性大. 
     337{{{ 
     338#!perl 
     339use YAML::Syck qw(Load Dump); 
     340 
     341&hoge(); 
     342 
     343sub hoge { 
     344    my $data = Load( join( '', <DATA> ) ); 
     345    &dump($data); 
     346    &dump($data); 
     347} 
     348 
     349sub 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__ 
     361hoge: 
     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---  
     374hoge:  
     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 
    333387== OOP 関連 == 
    334388=== 引数設定の自動化もどき ===