AutoHashedFuncs

概要

  • 関数名を指定しなくても関数定義するだけで自動的にハッシュに登録されるサンプル。
  • 型グロブを使って定義されている関数をスキャンする。

ソース

  • fileAutoHashedFuncs.zip
    すべてを展開すべてを収束
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
    
     
     
     
     
     
     
     
     
    -
    |
    |
    |
    |
    |
    -
    |
    -
    |
    !
    !
    |
    |
    |
    |
    |
    |
    |
    |
    -
    |
    |
    !
    |
    |
    -
    |
    |
    !
    |
    |
    -
    |
    |
    !
    !
     
     
     
     
     
     
    -
    -
    |
    -
    |
    !
    !
     
     
    
    # 関数名を指定しなくても関数定義するだけで自動的にハッシュに登録される。
     
    use strict;
    use warnings;
    use utf8;
    use Encode;
    use YAML::Syck;
     
    {
        package MyDecoder;
     
        # 関数へのリファレンスが格納されるハッシュ
        our %Decoders = ();
     
        foreach my $key ( sort( keys( %MyDecoder:: ) ) ){
            no strict "refs";
            if ( $key =~ /decode(.*)/ && *{"MyDecoder::$key"}{CODE} ){
                $Decoders{$1} = *{"MyDecoder::$key"}{CODE};
            }
        }
     
        # 型グロブからアクセスできるけど CODE ではないので登録されない
        my $decode1 = "aaa";
        my @decode2 = qw( bbb ccc ddd );
        our $decode3 = "eee";
        our @decode4 = qw( fff ggg hhh );
     
        # 登録される
        sub decodeAdd {
            my( $a, $b ) = @_;
            return $a + $b;
        }
     
        # 登録される
        sub decodeMul {
            my( $a, $b ) = @_;
            return $a * $b;
        }
     
        # 関数名がルールから外れているので登録されない
        sub helper1 {
            my( $a, $b ) = @_;
            return $a - $b;
        }
    }
     
    # $main::refDecoders にリファレンスをコピーして使い易くする
    my $refDecoders = \%MyDecoder::Decoders;
     
    print Dump( $refDecoders ) . "\n";
     
    for my $key ( qw( decode1 decode2 decode3 decode4 decodeAdd Add decodeMul Mul helper1 ) ){
        if ( my $dc = $refDecoders->{$key} ){
            print "$key:\t" . &{$dc}( 2, 4 ) . "\n";
        } else {
            print "$key:\t-\n";
        }
    }
     
    # EOF
    

添付ファイル: fileAutoHashedFuncs.zip 266件 [詳細]

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Sun, 15 Jul 2012 10:52:10 JST (2108d)