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

Responder a