January 2010 Archives

Perl 메타프로그래밍

| | Comments (0) | TrackBacks (0)
KLDP에서 어느분이 Ruby로 메타프로그래밍에 대해서 소개하시길래 Perl로 따라해봤다.

Perl에서도 현대적이고 최신의 OOP Framework인 Moose를 사용하면 손쉽고 강력한 메타프로그래밍이 가능하다. 그리고 유연하고 풍부한 문법은 다양한 프로그래밍 스타일을 구사하는데 막힘이 없다.



use 5.010;

# Tool 클래스 정의
{
    package Tool;
    use MooseX::SingletonMethod;

    sub setup1 {
        say "setup1";
    }
}

# Tool 클래스에 setup2 메소드 추가
Tool->meta->add_method( setup2 => sub { say "setup2" } );

my $tool = Tool->new;

# $tool 객체에 singleton 메소드 추가
$tool->add_singleton_method( setup3 => sub { say "setup3" } );

$tool->setup1;
$tool->setup2;
$tool->setup3;

my $tool2 = Tool->new;

$tool2->setup1;
$tool2->setup2;
$tool2->setup3;  # error




use 5.010;

# Brain 클래스 정의
{
    package Brain;
    use Moose;

    has iq => ( isa => 'Int', is => 'rw', default => 100 );
}

my $brain = Brain->new;
# 클래스 내부 들여다 보기
say $brain->meta->get_attribute('iq')->type_constraint;      # Int
say $brain->meta->get_attribute('iq')->get_value( $brain ); # 100





# 블럭 메소드 호출하기
use 5.010;
sub func {
    my ( $block ) = @_;
    $block->();
    &$block;  # 이렇게도 호출~
}

sub func2 {
    $_[0]->();  # 더 간단하게
    &{ $_[0] }; # 이렇게도 호출~
}

my $block = sub { say "Block" };

func($block);
func2($block);





use strict;
use warnings;
use 5.010;

# 메소드 호출테이블

my $METHOD_TABLE = [ qw/a b c d/ ];

sub a { say "sub a" }
sub b { say "sub b" }
sub c { say "sub c" }
sub d { say "sub d" }

&{$main::{$_}} for @{$METHOD_TABLE};

$main::{$_}->() for @{$METHOD_TABLE};

no strict 'refs';
foreach my $i ( 0 .. $#{$METHOD_TABLE} ) {
    &{ $METHOD_TABLE->[$i] };
}

$_->() for @{$METHOD_TABLE};

foreach my $func ( 'a' .. 'd' ) {
    &$func;
}

foreach my $func ( 'a' .. 'd' ) {
    $func->();
}

# 이런식이 더 나은?

my %METHOD_TABLE2 = (
                      a => sub { say "sub a" },
                      b => sub { say "sub b" },
                      c => sub { say "sub c" },
                      d => sub { say "sub d" },
                    );

$METHOD_TABLE2{$_}->() for 'a'..'d';



참고:

Ruby & Javascript Metaprogramming
Perl 5 Metaprogramming
Perl 6 Metaprogramming


Perl에서 CPAN모듈들을 설치할때 해당 모듈이 필요로 하는 모듈이 많을 경우 다음과 같이 기본적으로 설치할 것인지를 물어보는데 이런 모듈의 수가 많아지면 일일이 확인하며 yes를 해주기가 귀찮을 때가 많다. 특히나 Catalyst 웹프레임웍 같이 의존성을 많이 가지는 모듈일 경우는 더더욱..

- Catalyst::Plugin::I18N ...loaded. (0.04)
[XMLRPC Support]
- Catalyst::Plugin::XMLRPC ...missing.
==> Auto-install the 1 optional module(s) from CPAN? [y] y
[Pluggable Application Support]
- Catalyst::Plugin::Pluggable ...loaded. (0.04)
[DBIx::Class Support]
- Catalyst::Model::DBIC ...missing.
- Catalyst::Model::DBIC::Plain ...missing.
==> Auto-install the 2 optional module(s) from CPAN? [y] y

이럴때 물어보지 않고 필요할 모듈들을 자동으로 설치하려면 어떻게 해야 할까?

방법은 크게 2가지가 있다.

PERL__MM_USE_DEFAULT 환경변수를 1로 세팅하는 방법

$ PERL_MM_USE_DEFAULT=1 cpan
cpan> install Some::Module

CPAN설정에서 prerequisites_policy 을 follow로 설정하는 방법

$ cpan
cpan> o conf prerequisites_policy follow
cpan> o conf commit
cpan> install Some::Module


참고:
http://sipb.mit.edu/doc/cpan/
http://stackoverflow.com/questions/898782/how-do-i-tell-cpan-to-install-all-dependencies



About this Archive

This page is an archive of entries from January 2010 listed from newest to oldest.

December 2009 is the previous archive.

March 2010 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Creative Commons License
This weblog is licensed under a Creative Commons License.
Powered by Movable Type 4.21-en