exemplo de grep x map
----------------------------------
my @lista = ('a', 'b', 'c');                                      # o mesmo que 
@lista = qw/a b c/;

my @lista_grep = grep { $_ eq  'c' } @lista;          # @lista_grep = ('c'); a 
condicao $_ eq  'c' somente eh verdadeira, obviamente, para o elemento 'c'

my @lista_map = map { uc $_ } @lista;              # @lista_map = qw/A B C/; 
uppercase em todos os elementos

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

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


mais info....

http://perldoc.perl.org/functions/grep.html

http://perldoc.perl.org/functions/map.html

  From: "Flávio R. Lopes" 
  To: [email protected] 
  Sent: Sunday, May 29, 2011 7:31 PM
  Subject: Re: [SP-pm] grep e map


  Opa!...e aí Thiago?

  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!

  Seguindo seu exemplo:

map { BLOCO } LISTA;
grep { BLOCO } LISTA;
"BLOCO" não poderia ser uma "condição" em ambos os casos?

  Posso entender que grep trabalha me retornando os itens de uma lista 
INDIVIDUALMENTE, conforme atenderem a uma determinada condição?
  E que com o map eu manipulo as listas ?


  On 29-05-2011 17:24, Thiago Rondon wrote: 
On Sun, May 29, 2011 at 04:53:51PM -0300, "Flávio R. Lopes" wrote:
  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?

    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: http://sao-paulo.pm.org/
 SaoPaulo-pm mailing list: [email protected]
 L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

  



------------------------------------------------------------------------------


  =begin disclaimer
     Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
   SaoPaulo-pm mailing list: [email protected]
   L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
  =end disclaimer
=begin disclaimer
   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
 SaoPaulo-pm mailing list: [email protected]
 L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

Responder a