Table of Contents

概要

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

ソース

  • AutoHashedFuncs.zip
    # 関数名を指定しなくても関数定義するだけで自動的にハッシュに登録される。
    
    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

リンク