[SP-pm] grep e map

"Flávio R. Lopes" flavio.lopes at links.inf.br
Sun May 29 18:03:57 PDT 2011


Olá Russo, blz?

On 29-05-2011 19:48, Alexei Znamensky wrote:
> Flávio,
>
> 2011/5/29 "Flávio R. Lopes" <flavio.lopes em links.inf.br 
> <mailto:flavio.lopes em links.inf.br>>
>
>     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!
>
>
> 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.
>
> A diferença é que:
> - 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;
> - enquanto que o map vai usar o resultado do bloco ao invés do 
> elemento (do array de entrada), no array de saída.
>
> 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.
>
> []s,
> Alexei
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":
>
> [1] https://github.com/russoz/perltests/blob/master/test-grep.pl
É 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.
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.
É 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).
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?

> [2] https://github.com/russoz/perltests/blob/master/test-map.pl
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.
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.
Daí temos: result = 0 0 0 0 0 10 12 14 16 18
Aqui beleza!...tudo entendido!
>
>
>     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:SaoPaulo-pm em pm.org  <mailto:SaoPaulo-pm em pm.org>
>>       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: SaoPaulo-pm em pm.org
>     <mailto:SaoPaulo-pm em pm.org>
>      L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>     =end disclaimer
>
>
>
>
> -- 
> Alexei "RUSSOZ" Znamensky
> [russoz_gmail_com] [russoz.wordpress.com 
> <http://russoz.wordpress.com>] [www.flickr.com/photos/alexeiz 
> <http://www.flickr.com/photos/alexeiz>] [https://github.com/russoz]
> Only love / Can bring the rain / That makes you yearn to the sky
>
>
> =begin disclaimer
>     Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>   SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>   L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>    

-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20110529/ba9cfe8d/attachment.html>


More information about the SaoPaulo-pm mailing list