[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