[SP-pm] Dúvida entre Scalar Context e List Context
"Flávio R. Lopes"
flavio.lopes at links.inf.br
Mon Mar 22 20:05:16 PDT 2010
hummm....acho que descobri minha confusão!!...na verdade eu estava
confundindo UM VALOR ESCALAR com LISTA DE VALORES ESCALARES:
Veja se estou certo agora ou ainda está errado minha forma de pensar:
$monitor = valor_qualquer; ---> Me retorna um Contexto Escalar
@lista = lista_de_valores; ---> Me retorna um Contexto de Lista
($x, $y) = valor_qualquer; ---> Me retorna um Contexto de Lista (lista
de valores escalares!!) => era aki que tava pegando a coisa!, pois eu
não enxergava como "uma lista de scalares)
($valor) = valor_qualquer; --> Mesmo caso que o de cima, que na
veradade é uma LISTA que contém UM ÚNICO VALOR SCALAR
É isso?
Thiago Rondon escreveu:
>
> Flávio,
>
> Para entender bem este assunto, primeiramente você deve saber que no
> Perl existem três tipos nativos de dados: Escalar ($), uma string
> qualquer, de qualquer tamanho*, lista de escalares (@) é uma lista
> ordenada por números, onde eles são usados como a associação (chave)
> do escalar e finalmente listas associadas de escalares (%) , conhecido
> como 'hashes', é uma lista desordenada que tem como chave de
> associação uma string.
>
> Aí vem um poder mágico, a equivalência. As operações e valores em Perl
> podem depender do contexto. Você deve pensar em dois contextos:
> escalares e listas. E dependendo do que você deseja, o retorno desta
> operação pode ser uma.
>
> Equivalência ?
>
> Faça o seguinte teste:
> my @foo = ('alice', 'john');
> my ($one, $two) = @foo;
> my $count = @foo;
>
> Imprima os valores, e você irá observar o que é equivalencia, veja
> quando você passa o valor (=) do destino para a origem o interpretador
> analise a equivalência do contexto na operação.
>
> "wantarray" e "scalar" são funções para auxiliar o programador na
> manipulação do contexto entre as operações. Ou seja, quando você esta
> criando uma operação que precisa avaliar o contexto exigido por ela,
> você verifica se o contexto exigido é uma lista. Se você quiser que o
> contexto passado seja um escalar, você deve utilizar a função no envio
> do contexto.
>
> scalar = wantarray
>
> Por que não há uma função "array" para alterar o contexto do valor
> tratado na operação ? Pois, na pratica você nunca vai precisar disto,
> porém você pode se usar do (scalar) ou @{[scalar]} (isto é outro
> assunto). Assim como não existe uma wantscalar, pois não há sentido na
> pratica*.
>
> Quando você se utiliza da função print, ele esta esperando um lista
> (que pode conter apenas um escalar), ou seja então quando você passa
> uma lista (@rocks) ele vai interpretar como é esperado.
>
> Agora um detalhe para você entender 'scalar @rocks'. "scalar" é uma
> função unária, ou seja aceita apenas um argumento, no qual força este
> argumento ser interpretado no contexto escalar, e como caracteristica
> da função uma pequena comparação: Você possui a função length (função
> unária) para contar o número de caracteres* (não de bytes) do
> argumento e scalar para listas e "hashes":
>
> length($scalar)
> scalar(@array)
> scalar keys %hash
>
> Se você entendeu tudo, não vou precisar explicar porque scalar é
> função uma unária e o motivo.
>
> * Outros assuntos.
>
> Abraço,
> -Thiago Rondon
>
>
> Flávio R. Lopes escreveu:
>> Blz Solli e Nelson....acho que deu pra entender!
>>
>> É que no livro aparece o seguinte exemplo que me deixou em dúvida:
>>
>> @rocks = qw( talc quartz jade obsidian );
>> print "How many rocks do you have?\n";
>> print "I have ", @rocks, " rocks!\n"; # WRONG, prints names of
>> rocks
>> print "I have ", scalar @rocks, " rocks!\n"; # Correct, gives a number
>>
>> Então se eu utilizasse a penultima linha, eu estaria retornando um
>> Contexto de Lista (pois me traria a lista dos nomes das pedras)
>> Já na última, estou forçando "@rocks" a me retornar um valor escalar,
>> ou seja, esta linha é um Contexto Escalar! (pois me retorna o número
>> de elementos que tenho no meu array)
>>
>> É isso mesmo?
>>
>>
>> Nelson Ferraz escreveu:
>>> 2010/3/22 Solli Honorio <shonorio em gmail.com>:
>>>
>>>> Sempre é um prazer ajudar, mas para isto é importante ficar claro
>>>> qual a tua
>>>> dúvida ? Em que situação você fica confuso com algum conceito ? E
>>>> tente
>>>> explicar o que você entendeu para que possamos saber qual o nível de
>>>> informação você procura !
>>>>
>>>
>>> Como diz o Eric S. Raymond, no mundo dos hackers, o tipo de respostas
>>> que você obtém para suas questões técnicas depende bastante da forma
>>> que você faz as perguntas.
>>>
>>> Quanto ao conceito de contexto, é bem simples.
>>>
>>> my @list = (1..10);
>>> sub get_list {
>>> if (wantarray) {
>>> return @list;
>>> } else {
>>> my $item = shift @list;
>>> return $item;
>>> }
>>> }
>>>
>>> No exemplo acima existem duas maneiras de se chamar get_list():
>>>
>>> Contexto escalar:
>>> my $a = get_list(); # => 1
>>> my $b = get_list(); # => 2
>>> my $c = get_list(); # => 3
>>>
>>> Contexto de lista:
>>> my @x = get_list(); # => (1..10)
>>>
>>> Ou seja: o contexto é a forma como você chamou a subrotina -- você
>>> está atribuindo o resultado para um escalar ou para uma lista?
>>>
>>> Você frequentemente vai encontrar o wantarray dentro de um operador
>>> ternário ("?"):
>>>
>>> my @list = (1..10);
>>> sub get_list {
>>> return wantarray ? @list : shift @list;
>>> }
>>>
>>> Sugestão de leitura:
>>>
>>> http://www.perl.org.br/Artigos/SmartQuestionsHowTo
>>> _______________________________________________
>>> SaoPaulo-pm mailing list
>>> SaoPaulo-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>>
>>>
>>
>> _______________________________________________
>> SaoPaulo-pm mailing list
>> SaoPaulo-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>>
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
More information about the SaoPaulo-pm
mailing list