[SP-pm] grep e map

Renato Santos renato.cron at gmail.com
Sun May 29 18:10:28 PDT 2011


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?
*exato*
é como se fosse um WHERE da query, tudo que for verdadeiro entra.


2011/5/29 "Flávio R. Lopes" <flavio.lopes at links.inf.br>

>  Olá Russo, blz?
>
>
> On 29-05-2011 19:48, Alexei Znamensky wrote:
>
> Flávio,
>
> 2011/5/29 "Flávio R. Lopes" <flavio.lopes at 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 at pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> <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 at pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>
>
> --
> Alexei "RUSSOZ" Znamensky
> [russoz_gmail_com] [russoz.wordpress.com] [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 at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> <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 at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>


-- 
Renato Santos
http://www.renatocron.com/blog/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20110529/8d2ee3b5/attachment-0001.html>


More information about the SaoPaulo-pm mailing list