Changes between Version 48 and Version 49 of Perl


Ignore:
Timestamp:
06/05/10 02:34:03 (14 years ago)
Author:
atzm
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Perl

    v48 v49  
    218218== constant とハッシュ == 
    219219constant な値をハッシュのキーにすると,そのままでは文字列として解釈されてしまい,ハマる原因になる. 
    220 constant で定義したものの実体は関数なので,{{{&}}} をつけると良い. 
     220constant で定義したものの実体は関数なので,{{{&}}} をつけたり,きちんと評価させるために {{{+}}} をつけると良い. 
    221221 
    222222 * ダメな例 
     
    236236my %hash = ("hoge" => "raccho"); 
    237237print $hash{&HOGE}, "\n"; 
     238print $hash{+HOGE}, "\n"; 
    238239}}} 
    239240 
     
    333334   * 上記コードのうち,{{{hoge}}} 関数内の 2 連 {{{dump}}} の間に {{{keys(%{$data});}}} を挿入するだけで実行結果が変化することに注目. 
    334335 
     336== 動的ほげ == 
     337=== 動的関数呼び出し === 
     338 * 局所的にシンボリックリファレンスを使って関数を動的に呼び出してみる 
     339{{{ 
     340#!perl 
     341use strict; 
     342use warnings; 
     343use YAML::Syck qw(Load); 
     344 
     345sub _default_handler { 
     346    return -1; 
     347} 
     348 
     349sub _handle_hoge { 
     350    return scalar( @{ $_[0] } ); 
     351} 
     352 
     353sub _handle_unko { 
     354    return scalar( @{ $_[0] } ) + 50; 
     355} 
     356 
     357if ( $0 eq __FILE__ ) { 
     358    my $data = Load( join( '', <DATA> ) ); 
     359 
     360    while ( my ( $k, $v ) = each( %{$data} ) ) { 
     361        ( my $handler = '_handle_' . $k ) =~ s/\s+/_/g; 
     362 
     363        my $r = eval { 
     364            no strict 'refs'; 
     365            $handler->($v); 
     366        }; 
     367        if ($@) { 
     368            $r = _default_handler($v); 
     369        } 
     370 
     371        print "$k: $r\n"; 
     372    } 
     373} 
     374 
     375__DATA__ 
     376hoge: 
     377  - one 
     378  - two 
     379  - three 
     380unko: 
     381  - four 
     382  - five 
     383dame: 
     384  - damedame 
     385}}} 
     386   * {{{__DATA__}}} に書かれた YAML の各キー名に対応した {{{_handle_XXXX}}} を動的に呼び出している. 
     387     ハンドラがなければ {{{_default_handler}}} に fallback している 
     388 
    335389== Java で言う instanceof == 
    336390 * UNIVERSAL を使う 
     
    350404   * IO::File は IO::Handle のサブクラスなので true 
    351405 
     406 * {{{$obj->isa("myclass")}}} というのも可能. 
     407   ただしこの場合 $obj の内容を選ぶ (undef だったら? とか) ので, 
     408   場合によって eval してやる等の処置が重要 
     409 
    352410== あるオブジェクトにあるメソッドが定義されているかどうか調べる == 
    353411 * UNIVERSAL を使う 
     
    366424}}} 
    367425   * IO::File には print メソッドが定義されているので true 
     426 
     427 * {{{$obj->can("mymethod")}}} というのも可能. 
     428   ただしこの場合 $obj の内容を選ぶ (undef だったら? とか) ので, 
     429   場合によって eval してやる等の処置が重要 
    368430 
    369431== マジカルインクリメント ==