[Cascavel-pm] Res: Res: Variável de outro namespace no escopo global do package.

Adriano Ferreira a.r.ferreira em gmail.com
Terça Julho 17 05:07:50 PDT 2007


On 7/17/07, Daniel (r) Antunes <danielrantunes em yahoo.com.br> wrote:
>
>
> > No caso eu declaro a variável TEST já com um valor "0" (que é o
> > valor por omissão), ou seja, ela é uma variável declarada e
> > existente.
>
>     Eu declaro com : our TEST=0;

A sua declaração está correta. E é equivalente a:

$main::TEST = 0;

com a vantagem de que se você renomear o package do seu script
principal, ele vai continuar funcionando.

O problema que você está encontrando deve vir de outro lugar. Segue
uma adivinhação:

# script.pl   # o script principal

our $TEST = 0;

use Getopt::Long;

Getoptions( 't' => \$TEST );

use supplier;


#  supplier.pm

package supplier;

print $main::TEST;

Digamos que você faça:

$ perl script.pl -t

Neste caso, a declaração/inicialização de $TEST e a invocação de
Getoptions() acontece em runtime, enquanto o "use supplier" acontece
antes (em compile time, porque esta é a semântica do "use"). Neste
momento, nem a variável $TEST existe e muito menos o Getoptions() foi
invocado.

Note que este é um caso em que a ordem textual (our, Getoptions, use)
pode enganá-lo porque o código tem blocos de BEGIN ("use" é
equivalente a uma construção com BEGIN). A melhor solução é mesmo ter
uma sub em "supplier" que você invoca depois das inicializações
certas.

Outra alternativa feia e que vai lhe dar problemas mais tarde para
manter é parecida com isto:

our $TEST;

BEGIN { $TEST = 0 }
BEGIN { Getoptions( 't' => \$TEST ) }

use supplier;

que vai funcionar como você quer porque tudo antes do "use supplier"
foi promovido a compile-time graças aos blocos BEGIN.

Saudações,
Adriano.

>     Desculpe, me expressei mal... Quando disse que é o valor por omissão
> quis dizer dentro do meu sistema.
>     O X da questão é, como eu a torno visível para o escopo global dos
> packages ?
>     Obrigado.
>  Daniel (r) Antunes
> profissional de informática
> msn daniel.legend em terra.com.br
> yahoo-messenger danielrantunes em yahoo.com.br
> mobile + 55 11 8965 2999
> gnu/linux user #238553
>
>
>
> ----- Mensagem original ----
> De: Luis Motta Campos <luismottacampos em yahoo.co.uk>
> Para: Cascavel Perl Mongers <cascavel-pm em pm.org>
> Enviadas: Terça-feira, 17 de Julho de 2007 4:31:01
> Assunto: Re: [Cascavel-pm] Res: Variável de outro namespace no escopo global
> do package.
>
>
>
> On Jul 17, 2007, at 2:55 AM, Daniel (r) Antunes wrote:
> >     Saquei... Mas...
> >     No caso eu declaro a variável TEST já com um valor "0" (que é o
> > valor por omissão), ou seja, ela é uma variável declarada e
> > existente. Sendo este o caso o package supplier não deveria enxergá-
> > la ?
> >     Obrigado.
>
>    Ledo engano.
>
>        my $TEST;
>
>    declara a variável TEST com valor inicial undef(), não zero.
>
>    perldoc -f my
>
>    Putamplexos!
> --
> Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
> Perl fanatic evangelist, and amateur {cook, photographer}
>
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
>  ________________________________
> Novo Yahoo! Cadê? - Experimente uma nova busca.
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>


Mais detalhes sobre a lista de discussão Cascavel-pm