概要
- 関数名を指定しなくても関数定義するだけで自動的にハッシュに登録されるサンプル。
- 型グロブを使って定義されている関数をスキャンする。
ソース
-
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