[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