<br><div class="gmail_quote">Em 23 de março de 2010 01:15, Thiago Rondon <span dir="ltr">&lt;<a href="mailto:thiago@aware.com.br">thiago@aware.com.br</a>&gt;</span> escreveu:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<br>
Flávio,<br>
<br>
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 &#39;hashes&#39;, é uma lista desordenada que tem como chave de associação uma string.<br>


<br></blockquote><div><br>Sem querer ser chato, mas já sendo ... vc acha mesmo correta a tua definição de &#39;valor escalar&#39; ? Pergunto isto pq vc está associando a um tipo de valor, e isto verdade....<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


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.<br>


<br>
Equivalência ?<br>
<br>
Faça o seguinte teste:<br>
my @foo = (&#39;alice&#39;, &#39;john&#39;);<br>
my ($one, $two) = @foo;<br>
my $count = @foo;<br>
<br></blockquote><div><br>eu acho que aqui estamo confundindo mais do que ajudando, estamos falando de atribuições e misturando com contexto ... bom só para pensarmos numa melhor maneira de explicar isto ... eu ainda acho que o problema é que as pessoas não entendem a palavra &#39;contexto&#39;.... <br>

</div><div> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">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.<br>


<br>
&quot;wantarray&quot; e &quot;scalar&quot; 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.<br>


<br>
scalar = wantarray<br>
<br>
Por que não há uma função &quot;array&quot; 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*.<br>


<br>
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.<br>
<br>
Agora um detalhe para você entender &#39;scalar @rocks&#39;. &quot;scalar&quot; é 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 &quot;hashes&quot;:<br>


<br>
length($scalar)<br>
scalar(@array)<br>
scalar keys %hash<br>
<br>
Se você entendeu tudo, não vou precisar explicar porque scalar é função uma unária e o motivo.<br>
<br>
* Outros assuntos.<br>
<br>
Abraço,<br>
-Thiago Rondon<br>
<br>
<br>
Flávio R. Lopes escreveu:<div><div></div><div class="h5"><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Blz Solli e Nelson....acho que deu pra entender!<br>
<br>
É que no livro aparece o seguinte exemplo que me deixou em dúvida:<br>
<br>
@rocks = qw( talc quartz jade obsidian );<br>
print &quot;How many rocks do you have?\n&quot;;<br>
print &quot;I have &quot;, @rocks, &quot; rocks!\n&quot;;        # WRONG, prints names of rocks<br>
print &quot;I have &quot;, scalar @rocks, &quot; rocks!\n&quot;; # Correct, gives a number<br>
<br>
Então se eu utilizasse a penultima linha, eu estaria retornando um Contexto de Lista (pois me traria a lista dos nomes das pedras)<br>
Já na última, estou forçando &quot;@rocks&quot; 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)<br>
<br>
É isso mesmo?<br>
<br>
<br>
Nelson Ferraz escreveu:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
2010/3/22 Solli Honorio &lt;<a href="mailto:shonorio@gmail.com" target="_blank">shonorio@gmail.com</a>&gt;:<br>
 <br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Sempre é um prazer ajudar, mas para isto é importante ficar claro qual a tua<br>
dúvida ? Em que situação você fica confuso com algum conceito ? E tente<br>
explicar o que você entendeu para que possamos saber qual o nível de<br>
informação você procura !<br>
    <br>
</blockquote>
<br>
Como diz o Eric S. Raymond, no mundo dos hackers, o tipo de respostas<br>
que você obtém para suas questões técnicas depende bastante da forma<br>
que você faz as perguntas.<br>
<br>
Quanto ao conceito de contexto, é bem simples.<br>
<br>
my @list = (1..10);<br>
sub get_list {<br>
    if (wantarray) {<br>
        return @list;<br>
    } else {<br>
        my $item = shift @list;<br>
        return $item;<br>
    }<br>
}<br>
<br>
No exemplo acima existem duas maneiras de se chamar get_list():<br>
<br>
Contexto escalar:<br>
my $a = get_list(); # =&gt; 1<br>
my $b = get_list(); # =&gt; 2<br>
my $c = get_list(); # =&gt; 3<br>
<br>
Contexto de lista:<br>
my @x = get_list(); # =&gt; (1..10)<br>
<br>
Ou seja: o contexto é a forma como você chamou a subrotina -- você<br>
está atribuindo o resultado para um escalar ou para uma lista?<br>
<br>
Você frequentemente vai encontrar o wantarray dentro de um operador<br>
ternário (&quot;?&quot;):<br>
<br>
my @list = (1..10);<br>
sub get_list {<br>
    return wantarray ? @list : shift @list;<br>
}<br>
<br>
Sugestão de leitura:<br>
<br>
<a href="http://www.perl.org.br/Artigos/SmartQuestionsHowTo" target="_blank">http://www.perl.org.br/Artigos/SmartQuestionsHowTo</a><br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
<br>
  <br>
</blockquote>
<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
<br>
<br>
</blockquote>
<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>&quot;o animal satisfeito dorme&quot;. - Guimarães Rosa<br>