[SP-pm] Dúvida entre Scalar Context e List Context

Thiago Glauco thiago at nerdsland.net
Tue Mar 23 17:21:29 PDT 2010


Aiai..

Este é o tipo da coisa que é tão simples que fica difícil explicar...

Quando o Perl foi criado, uma das preocupações do Larry era tornar a 
linguagem parecida com a linguagem humana. Que é influenciada pelo 
contexto. O contexto é algo que deve estar subentendido pelas duas 
partes do dialogo.


Exemplo de contexto: “Chovem canivetes.” ou “Ele me cortou com um canivete.”

A palavra canivete varia conforme o contexto. E você sabe disso 
intuitivamente, culturalmente. É impossível chover canivetes. Mas você 
sabe que canivetes são perigosos. Então se alguém disser que choveram 
canivetes, você associa o canivete a uma situação de chuva perigosa, 
logo muita chuva.

Agora, vamos levar isto para o Perl.

$myVar = 1;
$myOtherVar = 2;
$sum = $myVar + $myOtherVar;

Para o Perl $myVar pode significar a string '1' ou o valor numérico 
inteiro '1'. O mesmo vale para $myOtherVar. Apartir do momento que você 
quer somar os valores o Perl para e pensa... Eu não posso somar strings 
com o operador '+'. Logo o programador quer dizer que os valores são 
numéricos. Isso é contexto.

Então, o Perl guarda o valor numérico da soma em $sum.

Seu código continua...

print $sum, "\n";

E o compilador sabe, pelo contexto, que agora você quer tratar $sum como 
uma string de texto, e não mais como um número... O contexto, dentro do 
Perl é como o contexto da linguagem humana. Você deve verificar a 
situação para saber o real significado das coisas. É estranho no começo 
mas com a experiência você percebe que é muito mais prático que se dar 
ao trabalho de explicar ao compilador o que você quer, como no Java, que 
te obriga a converter toda a hora os valores se isto já está implícito.

Chegando agora as listas:

quando você diz ao compilador

$myVar = @myArr

O compilador sabe que não pode colocar o array dentro de um Scalar. Mas 
o compilador também sabe que você não é um idiota. Então ele pensa: "O 
que existe em um array que pode ser guardado dentro de um escalar? Ah, 
já sei. O número de elementos do array".

se você fizer $myVar = "@myArr" o compilador vai entender que você quer 
transformar o conteúdo do array em um string por causa das aspas. Isso é 
contexto. É o que deve estar subentendido na situação.

se você fizer @myArr = $myVar você criou um array de um elemento.
e ($myVar1, $myVar2) = @myArr então os valores $myArr[0] e $myArr[1] 
serão associados as variáveis dentro dos parenteses...

Espero ter ajudado.



More information about the SaoPaulo-pm mailing list