読者です 読者をやめる 読者になる 読者になる

end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

perlにおける関数/メソッドの動的呼び出し

「$function()」のような関数呼び出しの場合、「no strict "refs"」します。

「$object->$method()」のようなメソッド呼び出しする場合は、
単純に文字列をメソッドとしてcallする方法と、GoFのコマンドパターンがあります。


詳細は、以下のscriptの通りです。

#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;

main();

sub main {

    #### DYNAMIC CALL FUNCTION
    my $func_name = "dynamic_call_function";
    {
        no strict "refs";
        &{$func_name}('ABCDE');
    }

    #### DYNAMIC CALL METHOD
    my $dynamic_class = DynamicCallClass->new();
    my $method_name = "dynamic_call_method";
    $dynamic_class->$method_name('ABCDE');


    #### DYNAMIC CALL METHOD (GoF - COMMAND PATTERN)
    my $dynamic_class_name = 'DynamicCallClass';
    $dynamic_class = $dynamic_class_name->new();
    $dynamic_class->dynamic_call_method('ABCDE');
}

sub dynamic_call_function {
    my ($arg_val) = @_;
    my $func_name = (caller(0))[3];
    print "$func_name was called ... arg_val=$arg_val\n";
}

1;


package DynamicCallClass;

sub new {
    my ($class) = @_;
    my $self = {};
    $self =  bless $self, $class;
    return $self;
}

sub dynamic_call_method {
    my ($self,$arg_val) = @_;

    my $method_name = (caller(0))[3];
    print "$method_name was called ... arg_val=$arg_val\n";
}

1;