Xpoint
   [напомнить пароль]

Динамическое создание пакета: как обойтись без eval?

Метки: [без меток]
2008-01-18 14:07:06 [обр] Vladimir(0/2)[досье]

День добрый.

Вопрос немного тривиальный. Но решения найти не могу.

Звучит совсем просто: «Как создать на лету пакет без использования eval».

Собственно примерно такая конструкция работает на ура:

#!/usr/bin/perl

package foo;
sub sending {
    my ( $self, $body ) = @_;
    print "Package: ", _PACKAGE_, "\n";
    print "Input: ", $self, ", body: ", $body, "\n";
    foreach (caller(1)) {
        print "sending from ", $_, "\n";
    }
}

1;

package main;

print "start\n";

$NameSpace = 'new_name_space';
my @t = qw[ rr rr2 ];
foreach my $f( @t ) {
    my $ns = 'main::'. $NameSpace .'::'. $f;
    eval ('package '. $ns .';use base qw[ foo ];' );
    "$ns"->sending( 'My text' );
}

print "Finish\n";

Как и полагается – выводит:

start
Package: foo
Input: main::new_name_space::rr, body: My text
Package: foo
Input: main::new_name_space::rr2, body: My text
Finish

А пакеты main::new_name_space::rr и main::new_name_space::rr2 можно использовать далее в программе с нормальным наследованием всего что нужно из пакета foo.

Есть ли возможность обойтись без eval?

спустя 17 минут [обр] Vladimir(0/2)[досье]

Собственно одно решение нашел. (Так всегда бывает, когда помучаешься полдня и напишешь в форум)

Но уж какоето оно не красивое.... ^)))
Создаем пакет 'new_name_space::new'

${'main::new_name_space::new::'} = {};
*{'main::new_name_space::new::'} = {};
@{'main::new_name_space::new::ISA'} = ('foo');
'main::new_name_space::new'->sending( 'My text' );

спустя 8 минут [обр] Алексей Севрюков(61/1292)[досье]
Vladimir[досье] Давайте поподробнее. Зачем создавать пакеты realtime?
спустя 5 минут [обр] Vladimir(0/2)[досье]

Например для конвертации "потаблично" базы в набор пакетов для дальнейшего использования с Class::DBI. Это в моем случае.

А вообще, можно и другие варианты придумать. Например в рамках иерархии наследования - мало ли, кому что надо.

спустя 16 минут [обр] Алексей Севрюков(61/1292)[досье]

Vladimir[досье] Вообщем Вы уже сами привели решение, только AFAIK, достаточно будет:

@main::new_name_space::new::ISA=qw(foo);
main::new_name_space::new->sending('My text');

P.S. Я не проверял.

Powered by POEM™ Engine Copyright © 2002-2005