<span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px; ">Pelo que estou vendo, quando se usa o Grep, ele me traz os itens do array de entrada que "deixa verdadeira" as condições do Bloco? Seria mais ou menos isso?</span><div>

<b style="border-collapse: collapse; font-family: arial, sans-serif; ">exato</b><br>é como se fosse um WHERE da query, tudo que for verdadeiro entra.</div><div><br></div><div><br><div class="gmail_quote">2011/5/29 "Flávio R. Lopes" <span dir="ltr"><<a href="mailto:flavio.lopes@links.inf.br">flavio.lopes@links.inf.br</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">


  

<div bgcolor="#ffffff" text="#000000">
Olá Russo, blz?<div class="im"><br>
<br>
On 29-05-2011 19:48, Alexei Znamensky wrote:
<blockquote type="cite">Flávio,<br>
  <br>
  <div class="gmail_quote">2011/5/29 "Flávio R. Lopes" <span dir="ltr"><<a href="mailto:flavio.lopes@links.inf.br" target="_blank">flavio.lopes@links.inf.br</a>></span><br>
  <blockquote class="gmail_quote" style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex">
    <div bgcolor="#ffffff" text="#000000">Opa!...e aí Thiago?<br>
    <br>
Então, pela sua explicação e juntando com o que li até agora, quando
você diz que o grep está associado à uma condição, o map também não
estaria? É isso que me confunde!<br>
    </div>
  </blockquote>
  <div><br>
  </div>
  <div>Não é bem "estar associado". Ambas as funções irão usar um bloco
de código para manipular , um a um, os elementos do array de entrada, e
irão produzir um array de saída.</div>
  <div><br>
  </div>
  <div>A diferença é que:</div>
  <div>- o grep vai usar o resultado do bloco para testar se o elemento
(do array de entrada) irá entrar no array de saída ou não;</div>
  <div>- enquanto que o map vai usar o resultado do bloco ao invés do
elemento 
  
(do array de entrada), no array de saída.</div>
  <div><br>
  </div>
  <div>Eu montei dois exemplos praticamente idênticos, um com grep[1] e
outro com map[2], recomendo que você execute os dois e tente entender a
diferença no resultado.</div>
  <div><br>
  </div>
  <div>[]s,</div>
  <div>Alexei</div>
  </div>
</blockquote></div>
Cara, desculpe minha ignorância, mas vamos lá. Acho que com este seu
exemplo, talvez eu consiga mostrar onde está minha dificuldade. Por
favor leia de baixo pra cima o que escrevi, ou seja, comece pelo "map":<div class="im"><br>
<blockquote type="cite">
  <div class="gmail_quote">
  <div><br>
  </div>
  <div>[1] <a href="https://github.com/russoz/perltests/blob/master/test-grep.pl" target="_blank">https://github.com/russoz/perltests/blob/master/test-grep.pl</a></div>
  </div>
</blockquote></div>
É aqui que não entendo porque o Perl, digamos, "não segue com a lógica
do bloco", ou seja, ele não faz o exemplo (abaixo) do MAP.<br>
Aqui ele somente coloca no meu array @result somente o "itens" do array
de entrada que correspondem A PRIMEIRA CONDIÇÃO do bloco, ou seja "X
> 4", que no caso correspondem: result = 5 6 7 8 9.<br>
É neste ponto que não consigo entender porque ele não segue analisando
TODA estrutura do bloco: { $_ > 4 ? 2 * $_ : 0 * $_ }, ou seja, ele
só me retorna os valores que deixam a expressão verdadeira, ou seja,
somente os itens que são maiores que 4 ($_ > 4).<br>
Pelo que estou vendo, quando se usa o Grep, ele me traz os itens do
array de entrada que "deixa verdadeira" as condições do Bloco? Seria
mais ou menos isso?<div class="im"><br>
<br>
<blockquote type="cite">
  <div class="gmail_quote">
  <div>[2] <a href="https://github.com/russoz/perltests/blob/master/test-map.pl" target="_blank">https://github.com/russoz/perltests/blob/master/test-map.pl</a></div>
  </div>
</blockquote></div>
Neste seu exemplo do MAP, ficou fácil de entender o funcionamento desta
função, que aliás é onde eu me atrapalho com o Grep.<br>
Aqui: se X > 4, faça X * 2 e coloque no array de saída, senão X * 0
e (também) coloque no array de saída.<br>
Daí temos: result = 0 0 0 0 0 10 12 14 16 18<br>
Aqui beleza!...tudo entendido!<div><div></div><div class="h5"><br>
<blockquote type="cite">
  <div class="gmail_quote">
  
  
  <div><br>
  </div>
  <div> </div>
  <blockquote class="gmail_quote" style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex">
    <div bgcolor="#ffffff" text="#000000"><br>
Seguindo seu exemplo:
    <div><br>
    <pre>map { BLOCO } LISTA;
grep { BLOCO } LISTA;
    </pre>
    </div>
"BLOCO" não poderia ser uma "condição" em ambos os casos?<br>
    <br>
Posso entender que <b>grep</b> trabalha me retornando os itens de uma
lista INDIVIDUALMENTE, conforme atenderem a uma determinada condição?<br>
E que com o <b>map</b> eu manipulo as listas ?
    <div>
    <div><br>
    <br>
    <br>
On 29-05-2011 17:24, Thiago Rondon wrote:
    <blockquote type="cite">
      <pre>On Sun, May 29, 2011 at 04:53:51PM -0300, "Flávio R. Lopes" wrote:
  </pre>
      <blockquote type="cite">
        <pre>Boa tarde pessoal.
Ainda não ficou claro para mim as diferenças entre map e grep.
Andei lendo uma coisas por aí (inclusive em Perldoc), mas mesmo
assim não consegui pegar os conceitos de forma clara.

Alguém poderia me dar alguns exemplos (ou alguma documentação ou
link) de quando usar um e outro?

    </pre>
      </blockquote>
      <pre>Olá Flávio,

Você pode pensar nos dois como um loop "foreach". No qual estas duas funções tem a habilidade de tornar o código mais compactado, o uso dos dois são:

map { BLOCO } LISTA;
grep { BLOCO } LISTA;

"map" aplica um bloco (função) em todos os elementos da lista, e retorna o resultado. "grep" retorna todos os elementos da lista que o bloco executado (função) retorna verdadeiro.

Ou seja, o "grep" poderia ser: 
@foo; foreach(@lista) { push (@foo,$_) if CONDIÇÃO };

Que é o mesmo que: 
@foo = map { if (CONDIÇÃO) { $_ } } @lista;

Que pode ser simplificado por: 
@foo = grep CONDIÇÃO, @lista;

Ou seja, o uso do grep esta associado a uma condição. Vamos ilustrar com um exemplo prático, vamos supor que você tenha uma array com valores dos arquivos de um diretório.

opendir(DIR, '/tmp');
@arquivos = readdir(DIR);

@diretorios = grep(-d, @arquivos);

Neste exemplo, você vai ler todos os elementos da array @arquivos, porém irá ter na array @diretorios somente o que passar pela condicional (-d). Ou seja, os diretórios de DIR.

Agora, por exemplo, você quer retornar todos os tamanho dos @arquivos. Veja, executar uma função e retornar o resultado:

@tamanhos = map(-s, @arquivos);

Espero que tenha ajudado.

-Thiago Rondon

=begin disclaimer
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a>
 L<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank"><http://mail.pm.org/mailman/listinfo/saopaulo-pm></a>
=end disclaimer

  </pre>
    </blockquote>
    <br>
    </div>
    </div>
    </div>
    <br>
=begin disclaimer<br>
  Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
    <br>
  </blockquote>
  </div>
  <br>
  <br clear="all">
  <br>
-- <br>
  <font face="georgia, serif">Alexei "RUSSOZ" Znamensky </font>
  <div><font face="georgia, serif">[russoz_gmail_com] [<a href="http://russoz.wordpress.com" target="_blank">russoz.wordpress.com</a>] [<a href="http://www.flickr.com/photos/alexeiz" target="_blank">www.flickr.com/photos/alexeiz</a>]
[<a href="https://github.com/russoz" target="_blank">https://github.com/russoz</a>]<br>
  <span style="border-collapse:collapse">
  <div>Only love / Can bring the rain / That makes you yearn to the sky</div>
  </span></font></div>
  <br>
  <pre><fieldset></fieldset>
=begin disclaimer
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a>
 L<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank"><http://mail.pm.org/mailman/listinfo/saopaulo-pm></a>
=end disclaimer
  </pre>
</blockquote>
<br>
</div></div></div>

<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br><br clear="all"><br>-- <br>Renato Santos<br><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a><br>
</div>