[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