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" <[email protected]> > Olá Russo, blz? > > > On 29-05-2011 19:48, Alexei Znamensky wrote: > > Flávio, > > 2011/5/29 "Flávio R. Lopes" <[email protected]> > >> 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: [email protected] >> 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: [email protected] >> 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: [email protected] > 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: [email protected] > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > > -- Renato Santos http://www.renatocron.com/blog/
=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
