<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=ISO-8859-1" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.19019">
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff text=#000000>
<DIV><FONT size=2 face=Arial>exemplo de grep x map</FONT></DIV>
<DIV><FONT size=2 face=Arial>----------------------------------</FONT></DIV>
<DIV><FONT size=2 face=Arial>my @lista = ('a', 'b', 
'c');                                      
# o mesmo que @lista = qw/a b c/;</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><FONT size=2 face=Arial>my @lista_grep = grep { $_ eq  'c' } 
@lista;          # @lista_grep = 
('c'); a condicao $_ eq  'c' somente eh verdadeira, obviamente, para o 
elemento 'c'</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><FONT size=2 face=Arial>my @lista_map = map { uc $_ } 
@lista;              
# @lista_map = qw/A B C/; uppercase em todos os elementos</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><FONT size=2 face=Arial>my @impares = grep { $_ % 2 } qw/1 2 3 4 5 6 7 8 
9/;      # @impares = qw/1 3 5 7 9/; a expressao $_ % 2 
eh o resto da divisao por 2 que da 1 (true) para os caras impares</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><FONT size=2 face=Arial>my @dobro = map { 2 * $_ } qw/1 2 3 4 5 6 7 8 
9/;           # @dobro = 
qw/2 4 6 8 10 12 14 16 18/; dobra o valor de CADA elemento</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><FONT size=2 face=Arial>mais info....</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><A 
href="http://perldoc.perl.org/functions/grep.html">http://perldoc.perl.org/functions/grep.html</A></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><A 
href="http://perldoc.perl.org/functions/map.html">http://perldoc.perl.org/functions/map.html</A></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<BLOCKQUOTE 
style="BORDER-LEFT: #000000 2px solid; PADDING-LEFT: 5px; PADDING-RIGHT: 0px; MARGIN-LEFT: 5px; MARGIN-RIGHT: 0px">
  <DIV 
  style="FONT: 10pt arial; BACKGROUND: #e4e4e4; font-color: black"><B>From:</B> 
  <A title=flavio.lopes@links.inf.br 
  href="mailto:flavio.lopes@links.inf.br">"Flávio R. Lopes"</A> </DIV>
  <DIV style="FONT: 10pt arial"><B>To:</B> <A title=saopaulo-pm@pm.org 
  href="mailto:saopaulo-pm@pm.org">saopaulo-pm@pm.org</A> </DIV>
  <DIV style="FONT: 10pt arial"><B>Sent:</B> Sunday, May 29, 2011 7:31 PM</DIV>
  <DIV style="FONT: 10pt arial"><B>Subject:</B> Re: [SP-pm] grep e map</DIV>
  <DIV><BR></DIV>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><BR>Seguindo seu exemplo:<BR><PRE wrap="">map { BLOCO } LISTA;
grep { BLOCO } LISTA;
</PRE>"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 ?<BR><BR><BR>On 29-05-2011 17:24, Thiago 
  Rondon wrote: 
  <BLOCKQUOTE cite=mid:20110529202442.GA23881@thiago-rondons-macbook-2.local 
  type="cite"><PRE wrap="">On Sun, May 29, 2011 at 04:53:51PM -0300, "Flávio R. Lopes" wrote:
  </PRE>
    <BLOCKQUOTE type="cite"><PRE wrap="">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 wrap="">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 class=moz-txt-link-freetext href="http://sao-paulo.pm.org/">http://sao-paulo.pm.org/</A>
 SaoPaulo-pm mailing list: <A class=moz-txt-link-abbreviated href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</A>
 L<A class=moz-txt-link-rfc2396E href="http://mail.pm.org/mailman/listinfo/saopaulo-pm"><http://mail.pm.org/mailman/listinfo/saopaulo-pm></A>
=end disclaimer

  </PRE></BLOCKQUOTE><BR>
  <P>
  <HR>

  <P></P>=begin disclaimer<BR>   Sao Paulo Perl Mongers: 
  http://sao-paulo.pm.org/<BR> SaoPaulo-pm mailing list: 
  SaoPaulo-pm@pm.org<BR> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm><BR>=end 
  disclaimer<BR></BLOCKQUOTE></BODY></HTML>