Почему мой сценарий Perl не может видеть наш () переменные, которые я определил в другом файле?

Это зависит.

В моих последних проектах, я реализовал единственный сервлет, который делегирует к нескольким подобным сервлету объектам, которые инстанцируют способом внедрения зависимости. Например, у меня есть что-то вроде этого в моем сервлете (псевдокод):

for(Handler handler : handlers) {
    if(handler.handle(request, response)) {
         return;
    }
}

, где Обработчик является интерфейсом с булевым дескриптором (запрос, ответ) метод. Я получаю свои обработчики из контейнера (быть им Spring или что-то еще более легкое).

причина этого состоит в том, что мне действительно нравится внедрение зависимости, и трудно достигнуть его в Сервлетах; и я действительно не чувствую очень дома с большинством платформ, которые обеспечивают внедрение зависимости веб-компонента - мне нравится простота сервлетов.

не Были для этого, я пойду с несколькими сервлетами, хотя существует компромисс; любой у Вас есть огромная сеть xml с партиями (и партиями) отображений сервлета или у Вас есть очень сложный сервлет (если Вы не используете что-то как мой подход d-i).

5
задан 8 revs, 6 users 52% 12 October 2009 в 13:10
поделиться

4 ответа

Во втором примере нет оператора require , но он все равно не сработает. Что наш делает, так это объявляет переменную пакета с лексической областью видимости. Поскольку у вас нет оператора package , он использует пакет по умолчанию main . Итак, ваш первый скрипт устанавливает переменную $ main :: var1 , но она будет доступна только в пределах этого файла.

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

8
ответ дан 18 December 2019 в 06:35
поделиться

Вместо этого я бы поместил конфигурацию в модуль.

Файл: MyConfig.pm

package MyConfig;
require Exporter;
use strict;

our @ISA                = qw(Exporter);
our @EXPORT             = qw( getconfig ); 

my %confighash = ( 
            thisone => 'one',
            thatone => 2,
            somthingelse => 'froboz',
                   );



sub getconfig {
 return  %confighash;
 }

1;

Пример использования:

#!/usr/bin/perl
use strict;
use warnings;

use MyConfig;

my %config = getconfig();

print $config{ somthingelse };

Это должно напечатать froboz

7
ответ дан 18 December 2019 в 06:35
поделиться

Похоже, вам нужен правильный файл конфигурации. Я бы выбрал файл конфигурации без кода, который вы можете прочитать, когда вам нужно что-то настроить. На CPAN есть модули для обработки практически любого формата конфигурации, который вы можете себе представить.

Если вы хотите сделать это так, как у вас есть, избавьтесь от нашего и объявите их с помощью use vars . Не позволяйте полиции ПБП пугать вас этим. :) Вам действительно нужен наш , чтобы ограничить область действия переменной пакета, а это прямо противоположно тому, что вы пытаетесь сделать.

6
ответ дан 18 December 2019 в 06:35
поделиться

наш () делает что-то немного другое, чем вы думаете. Его единственная цель - работать строго, требуя от вас объявления переменных пакета, которые вы собираетесь использовать (если они не являются полностью определенными или импортированными). Подобно строгому, его действие имеет лексическую область видимости. Чтобы использовать его для доступа к глобальному $ main: var1 из нескольких файлов (которые представляют собой разные области действия) как просто $ var1 , вам нужно сказать наш $ var1 ] в каждом файле.

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

2
ответ дан 18 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: