[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