Почему мой Perl-скрипт не видит переменные our (), которые я определил в другом файле? - PullRequest
5 голосов
/ 11 октября 2009

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

Скрипт 1: common.pl

#!/usr/bin/perl

our $var1 = "something";
our $var2 = "somethingelse";

Сценарий 2: ftp.pl

#!/usr/bin/perl

use strict;
use warnings;

require('common.pl');

print $var1; 

Я получаю сообщение об ошибке:

Global symbol "$var1" requires explicit package name

Ответы [ 5 ]

8 голосов
/ 11 октября 2009

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

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

7 голосов
/ 11 октября 2009

Я бы вместо этого поместил конфиг в модуль.

Файл: 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

6 голосов
/ 11 октября 2009

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

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

2 голосов
/ 12 октября 2009

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

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

1 голос
/ 13 ноября 2010

Попробуй это. Я новичок в Perl, но так я начал работать над сценарием, который я сделал

#!/usr/bin/perl

$var1 = "something";
$var2 = "somethingelse";
Script 2: ftp.pl

#!/usr/bin/perl

use strict;
use warnings;

our $var1;
our $var2;

require('common.pl');

print $var1;
...