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

Daniel de Oliveira Mantovani daniel.oliveira.mantovani at gmail.com
Sun Sep 28 09:07:25 PDT 2008


Se você RTFM (perldoc perlre), encontrará os quatro possíveis
caracteres que modificam o comportamento global da expressão regular:

i
   Do case-insensitive pattern matching.
   If use locale is in effect, the case map is taken from the current
   locale. See the perllocale manpage.

m
   Treat string as multiple lines. That is, change ``^'' and ``$''
from matching
   the start or end of the string to matching the start or end of any
   line anywhere within the string.

s
   Treat string as single line. That is, change ``.'' to match any character
   whatsoever, even a newline, which normally it would not match.
   The /s and /m modifiers both override the $* setting. That
   is, no matter what $* contains, /s without /m will force
   ``^'' to match only at the beginning of the string and ``$'' to match
   only at the end (or just before a newline at the end) of the string.
   Together, as /ms, they let the ``.'' match any character whatsoever,
   while still allowing ``^'' and ``$'' to match, respectively, just after
   and just before newlines within the string.

x
   Extend your pattern's legibility by permitting whitespace and comments.

Obrigado Nelson.

Eu não sabia que o $data->content(), retornava um scalar, ou melhor nunca
tinha pensado nisso.

"NÃO PODEM SER USADAS PARA INTERPRETAR HTML OU XML."
Entendi

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<http://search.cpan.org/%7Emiyagawa/Web-Scraper-0.24/lib/Web/Scraper.pm>

Eu não consegui extrair, o que eu extrai com meu REG, usando o módulo. Pode
me dar umas dicas, por favor?

O Gabriel me mandou estudar algumas coisas e olha ->
m#</strong><br><i>\((.+?)\)</i></td>#ig && print DATA $1,$/ foreach
split("$/",$data->content());

Obrigado a todos pela atenção.

2008/9/27 Luis Motta Campos <luismottacampos em yahoo.co.uk>

> 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'<http://www.hgcinema.com.br/programacao/index.php%27>);
>> 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<http://search.cpan.org/%7Emiyagawa/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.
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>



-- 
print
"\x54\x68\x65\x20\x53\x69\x6c\x65\x6e\x74\x20\x47\x75\x61\x72\x64\x69\x61\x6e",$/
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20080928/403c7bf0/attachment.html>


More information about the SaoPaulo-pm mailing list