Nano Hash - криптовалюты, майнинг, программирование

определение константы perl в специальном пакете

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

Предположим:
- Я установил свои общие данные в пакете my_common_declarations.pm.
- Я хочу использовать эти данные в другом пакете, my_perl_utils.pm например.

#!/usr/bin/perl -w
package my_perl_utils;
use parent qw(Exporter);
our @EXPORT_OK = qw(f1 f2);
use my_common_declarations qw(debugme);
my %setup = &debugme;
my $DEBUGME = $setup{setup}{debugme};

# This generates this error : "Use of uninitialized value"
use constant true => $setup{setup}{'true'};
print "=" x25, "\nDEBUG true :\nimport = " . $setup{setup}{'true'} . "\nconstant = " , true , "\n", "=" x25, "\n"; 

sub f1{
# some rationals using the true or false constants
}

sub f2{
}

1;  

Мне не удается получить "истинную" константу, объявленную без ошибок.

Должен ли я импортировать пакет общих объявлений только один раз в основную программу и объявить там константу соответствующим образом или повторно объявить ее в каждом пакете, где мне нужна эта константа?

Спасибо


Ответы:


1

Проблема, с которой вы столкнулись, - это взаимодействие между средой выполнения и временем компиляции в вашем скрипте. Любое объявление use имеет неявный BEGIN {...} блок вокруг него, что означает, что оно происходит во время компиляции. Ваше присвоение %setup происходит во время выполнения после объявления константы. Чтобы исправить это, нужно объявить переменную, а затем выполнить присвоение ей в блоке BEGIN. Таким образом, переменная будет определена к моменту вызова use constant ...:

use my_common_declarations 'debugme';

my (%setup, $DEBUGME);  # declare variables with file scope

BEGIN {
    %setup   = debugme;                # assign to variables at compile time
    $DEBUGME = $setup{setup}{debugme};
}

use constant true => $setup{setup}{true}; # %setup is defined now

В качестве альтернативы, поскольку вы экспортируете функцию, которая возвращает хеш, почему бы ей не вернуть ссылку на хэш, тогда вы можете написать свой код как:

use my_common_declarations 'debugme';

use constant true => debugme->{setup}{true};

В этом случае, поскольку debugme импортируется первым оператором use во время компиляции, он доступен в строке use constant ....

Но поскольку вы объявляете пакет для общих объявлений, почему бы просто не переместить определение ваших констант в этот пакет, а затем добавить такие вещи, как true, в список экспорта для этого пакета?

05.04.2011
  • спасибо Я внимательно рассмотрю ваши комментарии и постараюсь реализовать. 05.04.2011
  • Но он также использует подчеркивание в имени пакета, что означает, что он зарезервирован для локального использования (как он это делает). См. этот вопрос для подробностей. 05.04.2011
  • @cjm = ›Спасибо, что указали на это, я удалил эту часть своего ответа. 05.04.2011
  • Я переместил определение констант в пакет, как посоветовал, гораздо лучше, спасибо. Также помогло это. 06.04.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование