Как я могу импортировать код Perl из внешних файлов во время компиляции? - PullRequest
2 голосов
/ 17 февраля 2010

Помощь Perlers! Кто-нибудь знает, что простой подход «вставить код здесь» принесет код из внешних файлов один раз во время компиляции в пакет?

Справочная информация:

У меня стандартный внутренний класс в стиле PBP, который становится довольно большим. Я хочу разбить код на несколько файлов, но не расширять класс. Оптимально, я бы просто вставлял код в раздел «Волшебный Джуджу» примера модуля (см. Ниже) один раз во время компиляции.

Я смотрел на AutoLoader как на средство для достижения этой цели. Однако есть две вещи, которые заставляют меня задуматься. Если бы я мог обойти это, это могло бы быть почти оптимальным решением:

  1. Я не хочу разбивать каждый маленький сабвуфер на отдельный файл; только несколько файлов разумного размера (хотя использование подпрограмм в вызывающей программе - это нормально); и

  2. Я не хочу откладывать компиляцию на каждом подпрограмме; некоторые подпрограммы, которые я хотел бы скомпилировать при первом использовании. Тем не менее, это, вероятно, не нарушает условия сделки.

Я знаю, что Moose предоставляет «Роли», что, я думаю, делает это хорошо, но по разным причинам Moose не подходит для этого проекта, как и Mouse.

Я использовал «require q (some / file)» в расположении «Magic JuJu», но это не поддерживает область постоянных переменных, то есть подпрограммы из внешнего файла не «видят» хэши атрибутов объекта правильно (другими словами, размещение require в верхней части файла будет иметь тот же эффект). Я мог бы обойти это, всегда используя сеттеры и геттеры. Так что это не нарушает условия сделки, но потребует немного времени на кодирование и накладных расходов на выполнение, которые я бы не стал нести.

Наконец, я не хочу расширять класс; у него уже есть множественное наследование. Я просто хочу, чтобы простой подход «вставьте код сюда» привел бы код один раз во время компиляции.

В итоге:

  1. (обязательно) импортирует код из внешних файлов в пространство имен пакета
  2. (Обязательно) Делает это только во время компиляции или с минимальными накладными расходами во время выполнения
  3. (обязательно) Не ​​расширяет класс
  4. (желательно) С уважением вставить область видимости

Пример кода с комментарием «Волшебный Джуджу» ниже:

package T;

use strict;
use warnings;

########## BEGIN object persistent variables scope block ############
{
  my %Attr_Name_Env;

  ## Constructor 'new'
  #
  sub new {
    ## Get and confirm arguments
    #
    my $class      = shift;
    my $href_arg = {@_};
    my $name_env = $href_arg->{'name_env'};

    ## Bless anon scalar into class
    #
    my $obj_new   = bless anon_scalar(), $class;
    my $idx_self  = ident $obj_new;

    # Populate object attributes
    #
    $Attr_Name_Env{ $idx_self } = $name_env;

    return $obj_new;
  }
  ## END Constructor 'new'

  sub DESTROY {... as you do ...}

  sub t_get_name_env {
    my $self      = shift;
    my $idx_self  = ident $self;
    return $Attr_Name_Env{ $idx_self };
  }

  ## insert magic juju here

}
########## END object persistent variables scope block ############

1;

Может быть, НАЧАЛО блока с бредом и оценкой ...

Ответы [ 2 ]

2 голосов
/ 17 февраля 2010

Вы можете просто использовать модули и импортировать нужные подпрограммы.

use MyMod qw( wanted_sub_1 wanted_sub2 );

Чтобы получить доступ к вашим хэшам атрибутов, вам нужно изменить import для ваших целевых модулей.

package MyClass;
use MyMod { attrib1 => \%attrib1, attrib2 => \%attrib2 }, qw( wanted_sub1 wanted_sub2 );

MyMod * import будет затем создавать ссылки кода, закрытые по начальному хэш-аргументу, и устанавливать их в пространство имен MyClass.

1 голос
/ 17 февраля 2010

Если вы готовы жить с последствиями, существует Фильтр :: Макрос .

...