[SP-pm] grep e map

Thiago Rondon thiago at aware.com.br
Sun May 29 13:24:43 PDT 2011


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



More information about the SaoPaulo-pm mailing list