[Cascavel-pm] Escopo: Dúvida

Fabiano fabiano em cascavel.pm.org
Domingo Janeiro 5 19:55:08 CST 2003


On Sun, 5 Jan 2003 21:24:50 -0200, Ednardo Lobo wrote
> Em perl o  escopo de uma variável,  é sempre o bloco em  que a mesma
> foi declarada, por exemplo:
> 
>         ------------------------------------------------------------
>         use strict;
>         
>         {
>             my $a = 10
>             my $f = 0;
> 
>             while (not $f) {
>                 my $a = 20;
> 
>                 $f = 1;
> 
>                 print $a    # imprime 20
>             }
> 
>             print $a        # imprime 10
>             print $f        # imprime 1
>         }
> 
>         print $f;           # com 'use strict', variável indefinida
>         ------------------------------------------------------------
> 
>     Minha dúvida: File Handles, também possuem escopo?
> 
>     Por exemplo:
>     
>         ------------------------------------------------------------
>         use strict;
> 
>         open FH,">>/etc/passwd";
> 
>         my ($login,$password) = &get();
> 
>         ...
> 
>         print FH "$login:$password:$UID:$GID::$HOME:$SHELL\n"
> 
>         close FH;
> 
>         #
>         ## Obtem `login' e `password'
>         # 
>         sub get {
>             open FH,"/var/tmp/user.tmp";
>             
>             my ($login,$passwd) = split / /,<FH>;
> 
>             close FH;
> 
>             return($login,$password);
>         }
>         ------------------------------------------------------------
> 
>     O que acontecerá com `FH' após `&get' ter sido executada?        
> 
>         
> -- 
>     Ednardo Lobo - www.elobo.cjb.net
> 
> --

"...(A referência pode ser uma referência simbólica ao nome do handle de
arquivos ou uma referência fixa a qualquer objeto que possa ser interpretado
como um handle de arquivos. Isso é chamado de handle de arquivos indireto, e
qualquer função que use um HANDLEARQUIVOS como seu primeiro argumento pode
tratar de handles de arquivos diretos e indiretos...
...
{
   my $fh;                   # (não inicializado)
   open($fh, ">arqlog")      # $fh é autovivificado
       or die "Impossível criar arqlog: $!;
   ...                       # faz algo com $fh
}                            # $fh fechado aqui

   A declaração my $fh pode ser inforporada de modo confiável ao open:

open my $fh, ">arqlog" or die...

" (O'REILLY, Pragramming Perl 3ª Ed., pag. 761)

   Ola', Ednardo
   Espero que este pequeno paragrafo que retirei do livro citado acima tenha
ajudado.

Exemplo:
------------------------------------------------------------
 use strict;
 
  open my $FH,">>/etc/passwd";
   my ($login,$password) = &get();
   ...
   print $FH "$login:$password:$UID:$GID::$HOME:$SHELL\n"
  close $FH;
 
 #
 ## Obtem `login' e `password'
 # 
 sub get {
  open my $FH,"/var/tmp/user.tmp";
   my ($login,$passwd) = split / /,<$FH>;
  close $FH;
 
  return($login,$password);
 }

[]'s
--Fabiano Reese Righetti (fabiano em cascavel.pm.org)





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