# db8_read - Perl function for reading records in the DB822 format # 2000-2017 Vlado Keselj, version 1.4; documentation in DB822.txt sub db8_read { my $arg = shift; if ($arg =~ /^file=/) { my $f = $'; local *F; open(F, $f) or die "cannot open $f:$!"; $arg = join('', ); close(F); } my $db = []; while ($arg) { my $prologue; if ($arg =~ /^([ \t\r]*(#.*)?\n)+/) { $prologue = $&; $arg = $'; } last if $arg eq ''; my $record; if ($arg =~ /([ \t\r]*\n){2,}/) { $record = "$`\n"; $arg = $'; } else { $record = $arg; $arg = ''; } my $r = {}; while ($record) { $record =~ /^[ \t]*([^\n:]*?)[ \t]*:/ or die "db8: no attribute"; my $k = $1; $record = $'; while ($record =~ /^(.*)(\\\r?\n|\r?\n[ \t]+)(\S.*)/) { $record = "$1 $3$'" } $record =~ /^[ \t]*(.*?)[ \t\r]*\n/ or die; my $v = $1; $record = $'; if (exists($r->{$k})) { my $c = 0; while (exists($r->{"$k-$c"})) { ++$c } $k = "$k-$c"; } $r->{$k} = $v; } push @{ $db }, $r; } return $db; }