[SP-pm] Dúvida sobre $1 em percorrer linhas.

Luis Motta Campos luismottacampos at yahoo.co.uk
Sat Sep 27 01:29:53 PDT 2008


Daniel de Oliveira Mantovani wrote:
> Boa Noite
> 
> Seguinte : Se eu pegar a fonte deste site: 
> http://www.hgcinema.com.br/programacao/index.php , salvar em um txt,
> como no caso abaixo "cinema.txt", funciona perfeitamente.
> 
> open CINE,"<","cinema.txt" or die "Nao pode abrir cinema.txt\n"; my
> @cinema = <CINE>; m#</strong><br><i>\((.+?)\)</i></td># && print
> $1,$/ foreach @cinema;
> 
> Agora, se eu pego direito da Internet só pega a primeira linha. open
> DATA,">>","database.db" or die "Não pode abrir database.db\n"; my
> $database = WWW::Mechanize->new(); 
> $database->get('http://www.hgcinema.com.br/programacao/index.php'); 
> m#</strong><br><i>\((.+?)\)</i></td># && print $1,$/ foreach 
> $database->content;
> 
> Não entendi, pois pelo que eu "sei" deveria funcionar da mesma forma,
> afinal os dois contém a mesma coisa.

Você, prá variar, não presta atenção no que está fazendo.

Se você tivesse RTFM, saberia que WWW::Mechanize::content() retorna o
texto *todo* em uma linha, enquanto que "perldoc -f open" vai te
explicar que ler um arquivo texto em contexto de lista (como você fez)
te retorna uma lista de elementos separados por $/ (que normalmente
contém "\n").

Assim, você não sabe nada, não presta atenção, não lê o manual e não
sabe com o que está mexendo: open() e content() retornam coisas
diferentes, de formas diferentes, e você está assumindo que são iguais.

> Então, estou me esforçando se eu não me engano eu estava falando com
> o Wendel um tempo atrás ou com o Blabos ou com o Gabriel, e tem um
> caractere que transforma tudo em uma linha só, pois acho que quando 
> puxa direito da Internet ele não percorre todas as linhas, único
> problema que não lembro qual é esse caractere.

O "caracter que transforma tudo em uma linha" que você está procurando 
não existe. A gente tem uma "opção de expressão regular" que aplica a 
expressão múltiplas vezes contra uma mesma string, numa espécie de loop 
(/g). Mas isso não vai fazer o que você quer, também.

Eu já te disse uma vez, e você continua teimando. Se você quer aprender 
a usar expressões regulares, precisa aprender que expressões regulares 
NÃO PODEM SER USADAS PARA INTERPRETAR HTML OU XML.

Se você quer aprender a programar e a manipular HTML e a extrair dados 
de páginas da web com isso, eu recomendo o Web::Scraper, do Tatsuhiko 
Miyagawa:

http://search.cpan.org/~miyagawa/Web-Scraper-0.24/lib/Web/Scraper.pm

Também recomendo que você tente aprender a usar parsers prontos, como o 
XML::Compile, do Mark Overmeer; o XML::TreeBuilder, do Sean Burke; e até 
mesmo o XML::Twig, do Michael Rodriguez.

Finalmente, mas não menos importante, leia alguma coisa sobre o Perl 
Debugger ("perldoc perldebug") -- assim, você vai pelo menos conseguir 
dizer que estruturas de dados você tem no seu programa, e talvez consiga 
fazer perguntas mais inteligentes que as que você tem feito.

Putamplexos.
-- 
Luis Motta Campos is a software engineer,
Perl Programmer, foodie and photographer.


More information about the SaoPaulo-pm mailing list