[SP-pm] Uma ajuda no módulo BibTeX

Juliana julianalduque at yahoo.com.br
Thu Oct 1 03:55:30 PDT 2009


Bom dia, Breno!
 
Quanta gentileza!
Nem sei como agradecer esse 'empurrão'.
Eu li sim o manual, e tive um pouco de dificuldade para entender como 'pegava' e 'imprimia' os campos que eu precisava.
Agora sim, consegui entender e isso vai me ajudar muito, pois ainda tenho muito o que incrementar no meu código.
Mais uma vez, obrigada e tenha um ótimo dia.
 
[]´s, Juliana


--- Em qui, 1/10/09, breno <breno em rio.pm.org> escreveu:


De: breno <breno em rio.pm.org>
Assunto: Re: [SP-pm] Uma ajuda no módulo BibTeX
Para: saopaulo-pm em mail.pm.org
Data: Quinta-feira, 1 de Outubro de 2009, 4:27


2009/9/30 Juliana <julianalduque em yahoo.com.br>
>
> Boa tarde Pessoal!
>

Oi Juliana, bem vinda à lista!

> Preciso de uma ajudinha!!
> Não consegui "printar" nada na tela (ainda rsr).
>
> Preciso inicialmente imprimir o título e autores. Estou no caminho certo?

Está sim. Pelo seu código nota-se que vc leu o manual. Infelizmente,
esse módulo segue um modelo de documentação completo porém não muito
ortodoxo ou antenado com boas práticas, o que pode dificultar o
entendimento de iniciantes.

A resposta curta é "vc esqueceu de ler o Text::BibTeX::Entry, que
lista os métodos necessários pra manipular cada entrada dentro do seu
loop".

Abaixo, minha versão, seguida de alguns comentários:

----------------8<----------------
#!/usr/bin/perl
use strict;
use warnings;

use Text::BibTeX;

my $bib = Text::BibTeX::File->new;

$bib->open('arquivo.bib')
    or die "erro abrindo arquivo: $!\n";

$bib->set_structure('Bib',
        sortby       => 'name',
        namestyle => 'full',
     );

while (my $entry = Text::BibTeX::Entry->new($bib) ) {
    next unless $entry->parse_ok;

    foreach my $campo ( $entry->fieldlist ) {
        print "$campo: " . $entry->get($campo) . "\n";
    }
}
---------------->8----------------

Note que no exemplo eu usei $entry->fieldlist pra pegar a lista de
campos disponíveis em cada entrada do arquivo bibtex. Se você só quer
título e autor, pode fazer algo como:

----------------8<----------------
    foreach my $campo ( qw( title author ) ) {
        print "$campo: " . $entry->get($campo) . "\n";
    }
---------------->8----------------

ou simplesmente:

----------------8<----------------
    print "titulo: " . $entry->get('title')     . "\n";
    print "autor: " . $entry->get('author') . "\n";
---------------->8----------------

Agora, vamos destrinchar rapidamente as diferenças:

* "use strict; use warnings;" - é muito importante que essas sejam
sempre as primeiras duas linhas dos seus programas. Elas garantem que
eventuais erros de código sejam facilmente identificados (e
corrigidos). Ao fazer isso, preste atenção para declarar suas
variáveis antes de usá-las (essencialmente, escreva "my $var" ao usar
$var pela primeira vez). Ah, uma dica: no inicio, as vezes é legal
também botar uma terceira linha, com "use diagnostics", que vai pegar
os erros gerados e exibir um pequeno texto informativo sobre o
problema, com dicas sobre o que pode ter acontecido e recomendações
para solucionar.

* "Modulo->new" x "new Modulo" - sim, a sintaxe indireta é a usada na
documentação do Text::BibTeX, mas não é recomendada. Acontece que
"new" não é uma palavra reservada do Perl e sim um método como
qualquer outro, que por acaso (ou melhor, por convenção) chama-se
"new" e age como construtor do objeto. Se houver uma palavra reservada
do Perl (uma função, por exemplo) com o mesmo nome do método que vc
quer chamar, ou mesmo uma sub no seu código com aquele mesmo nome, ela
terá preferência e seu programa não vai fazer o que você quer. Por
isso, para chamar métodos de classes/objetos, utilize sempre a notação
direta Modulo->metodo.

* "|| x or" - ambos são ou lógico, então é um pouco questão de gosto.
Mas o "or" foi desenhado especialmente para ter a precedência mais
baixa possível, de modo que, além de facilitar a legibilidade, ele é
sempre a última coisa a ser avaliada na expressão, fazendo o que você
quer (processa expressao e, se ela for undef, faz o que está do outro
lado do or). Para o exemplo simples "open or die" tanto faz, mas em
situações mais complexas ele pode ser bem mais útil, então acho q vale
a pena ir se acostumando. Repare ainda na identação, quebrando a linha
e dando um tab entre a expressão e o "or X". Ela também é questão de
gosto, mas acho q facilita a leitura e compreensão do código manter as
principais declarações à esquerda (o Damian Conway explica no Perl
Best Practices que trata-se do "end-weight problem").

* "namestyle => 'full'," <-- (colocar vírgula ao final de listas) - em
Perl as vírgulas em listas são apenas separadores de valores, sem
nenhum significado maior. Isso significa que você pode utilizar as
vírgulas como "terminadores" para seus elementos, o que facilita muito
não só na inclusão de novos elementos (já que você não precisa mudar
nada na linha anterior) como a reordenação da lista (vc pode trocar o
último elemento com outro lá na meiúca diretamente, sem precisar se
preocupar com adicionar/remover vírgulas).


É isso. Espero ter ajudado. Qq dúvida tamos aí :-)

Ah, já ia esquecendo. No primeiro dia do YAPC::Brasil (dia 30 de
outubro agora) haverão palestras voltadas especificamente para o
público iniciante, incluindo dois minicursos - um de introdução ao
Perl com o Samir e outro de Expressões Regulares com a Mila. Muita
gente de São Paulo já veio me procurar dizendo que vai (alguns até se
pronunciaram aqui na lista mesmo!) então de repente você consegue vir
com a "caravana", ou quem sabe até junta um povo da FUG pra vir também
- quanto mais melhor (sem falar que barateia o hotel)!


[]s

-b

> Quando tentava fazer diretamente sem utilizar o módulo do BibTeX era mais fácil.. agora com o módulo, é como começar do zero de novo..
>
> #!/usr/local/bin/perl
>
>    use Text::BibTeX;
>    $bib = new Text::BibTeX::File;
>    $bib->open ("arquivo.bib") || die "Arquivo nao Encontrado: $!\n";
>    $bib->set_structure ('Bib',
>                             sortby => 'name',
>                             namestyle => 'full');
>
>    while ($entry = new Text::BibTeX::Entry $bib)
>    {
>       print $entry; #aqui devo imprimir titulo e autor
>     }
>
>    $at_eof = $bib->eof;
>    $bib->close;
>
> Que comando faz imprimir na tela? rs
>
> Obrigada!
> Juliana
>
> ________________________________
> Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 - Celebridades - Música - Esportes
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
_______________________________________________
SaoPaulo-pm mailing list
SaoPaulo-pm em pm.org
http://mail.pm.org/mailman/listinfo/saopaulo-pm



      ____________________________________________________________________________________
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20091001/ca479809/attachment-0001.html>


More information about the SaoPaulo-pm mailing list