Subject: | (wrong) bibtex parsing error/fatal error |
The following script causes strange error messages:
$ cat test.pl
#!/usr/bin/perl
use warnings;
use strict;
use Text::BibTeX;
my $bibtex = 'bibtex-bug.bib';
my @pdflist = (
'Hartmann___Globale_Medienkultur',
'Flusser___Medienkultur',
'Hartree___Calculating_Machines_and_Calculating_Instruments_and_Machines',
);
foreach my $pdf (@pdflist) {
find($bibtex, lc $pdf);
}
sub find {
my ($bibtex, $pdf) = @_;
my $bibfile = Text::BibTeX::File->new( $bibtex ) or die "Could not
open '$bibtex': $!";
while( my $entry = Text::BibTeX::Entry->new( $bibfile ) ) {
next unless $entry->parse_ok;
my $author = ($entry->names('author'))[0];
if ( $author ) {
($author) = $author->part('last');
}
else {
($author) = ($entry->names('editor'))[0]->part('last');
}
my $title = $entry->get('title') || '';
if ( $pdf =~ /\Q$author\E___\Q$title\E/i ) {
return 1;
}
}
}
__END__
$ perl test.pl
invalid token near line 11 (text was '@')
bibtex-bug.bib, line 11, syntax error: found "ook", expected one of:
start of entry ("{" or "(") or quoted string ({...} or "...")
If I modify the attached bibtex-bug.bib (e.g. remove the 4th line
[publisher = {...}]), then I get another strange error message:
$ perl test.pl
fatal error: bt_parse_entry: you can't interleave calls across different
files
Yes, the script not very minimal, but every try to minimize it did
*not* throw the error message. I couldn't test Text-BibTeX 0.38, because
it does not compile on i86_64 (see #40675) and had to use the packages
provided by my linux distribution (Debian GNU/Linux - testing).
Please let me know if you have ideas to minimize my test script to catch
this annoying bug.
Thanks, Frank
$ perl -V
Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
Platform:
osname=linux, osvers=2.6.22-3-vserver-amd64,
archname=x86_64-linux-gnu-thread-multi
uname='linux excelsior 2.6.22-3-vserver-amd64 #1 smp tue feb 12
10:01:41 utc 2008 x86_64 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.10.0
-Dsitearch=/usr/local/lib/perl/5.10.0 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio
-Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib
-Dlibperl=libperl.so.5.10.0 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=define, use64bitall=define, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN
-fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64',
optimize='-O2 -g',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing
-pipe -I/usr/local/include'
ccversion='', gccversion='4.3.2', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib /lib64 /usr/lib64
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.7.so, so=so, useshrplib=true, libperl=libperl.so.5.10.0
gnulibc_version='2.7'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib'
Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV
PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
USE_64_BIT_ALL
USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
USE_PERLIO USE_REENTRANT_API
Built under linux
Compiled at Nov 2 2008 07:32:27
%ENV:
PERL_AUTOINSTALL="--defaultdeps"
PERL_EXTUTILS_AUTOINSTALL="--defaultdeps"
PERL_MM_USE_DEFAULT="1"
@INC:
/etc/perl
/usr/local/lib/perl/5.10.0
/usr/local/share/perl/5.10.0
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.10
/usr/share/perl/5.10
/usr/local/lib/site_perl
.
Subject: | bibtex-bug.bib |
@book{flusser:2005,
author = {Flusser, Vilem},
title = {Medienkultur},
publisher = {a publisher},
LIBRARY = {},
YEAR = {2005},
ANNOTE = {none}
}
@collection{folkerts+etal:1989,
editor = {Folkerts, Menso and Knobloch, Eberhard and Reich, Karin},
TITLE = {Mass, Zahl und Gewicht.},
PUBLISHER = {VCH, Acta Humanoria [u.a.]},
ADDRESS = {Weinheim [u.a.]},
SERIES = {Ausstellungskataloge der Herzog August Bibliothek },
VOLUME = {60},
PAGES = {},
ADDENDUM = {Vorwort und Einleitung},
YEAR = {1989},
ANNOTE = {none}
}
Subject: | test.pl |
#!/usr/bin/perl
use warnings;
use strict;
use Text::BibTeX;
my $bibtex = 'bibtex-bug.bib';
my @pdflist = (
'Hartmann___Globale_Medienkultur',
'Flusser___Medienkultur',
'Hartree___Calculating_Machines_and_Calculating_Instruments_and_Machines',
);
foreach my $pdf (@pdflist) {
find($bibtex, lc $pdf);
}
sub find {
my ($bibtex, $pdf) = @_;
my $bibfile = Text::BibTeX::File->new( $bibtex ) or die "Could not open '$bibtex': $!";
while( my $entry = Text::BibTeX::Entry->new( $bibfile ) ) {
next unless $entry->parse_ok;
my $author = ($entry->names('author'))[0];
if ( $author ) {
($author) = $author->part('last');
}
else {
($author) = ($entry->names('editor'))[0]->part('last');
}
my $title = $entry->get('title') || '';
if ( $pdf =~ /\Q$author\E___\Q$title\E/i ) {
return 1;
}
}
}