--- trunk/filter/mem_lookup.pm 2004/01/18 21:11:39 205 +++ branches/lezbib/filter/mem_lookup.pm 2004/09/21 16:53:44 458 @@ -23,6 +23,9 @@ # indexer, so it's save to leave type="" undefiend # - lookup will (of course) return one or more values +use warnings; +use strict; + sub mem_lookup { my @out; foreach (@_) { @@ -31,22 +34,26 @@ # store in array if it doesn't exist if (! grep(/^$v$/, @{$main::cache->{mem_lookup}->{$k}})) { push @{$main::cache->{mem_lookup}->{$k}}, $v; -#print STDERR "## mem_lookup store: $k => $v\n"; +#print STDERR "## mem_lookup store: $k => $v [",join("|",@{$main::cache->{mem_lookup}->{$k}}),"]\n"; } } elsif (/^(.*)\[([^\[]*)\[([^\[\]]+)\]([^\]]*)\](.*)$/) { # indirect lookup [prefix[key]suffix] my ($pre,$prek,$k,$postk,$post) = ($1,$2,$3,$4,$5); if ($main::cache->{mem_lookup}->{$k}) { my @keys = @{$main::cache->{mem_lookup}->{$k}}; -#print STDERR "## mem_lookup fetch keys $k == ".join("|",@keys)."\n"; +#print STDERR "## mem_lookup fetch keys $pre|$prek|$k|$postk|$post == [".join("|",@keys)."]\n"; foreach my $k2 (@keys) { - if ($main::cache->{mem_lookup}->{$prek.$k2.$postk}) { - foreach my $v (@{$main::cache->{mem_lookup}->{$prek.$k2.$postk}}) { - push @out,$pre.$v.$post; + my $full_k = $prek.$k2.$postk; + if ($main::cache->{mem_lookup}->{$full_k}) { + foreach my $v (@{$main::cache->{mem_lookup}->{$full_k}}) { + my ($pret,$postt) = ($pre,$post); + $pret=~s/\[$k\]/$k2/g; + $postt=~s/\[$k\]/$k2/g; + push @out,$pret.$v.$postt; } } } -#print STDERR "## mem_lookup return values $k == ".join("|",@out)."\n"; +#print STDERR "## mem_lookup return values $pre\[$prek\[$k\]$postk\]$post == [".join("|",@out)."]\n"; } } elsif (/^(.*)\[([^\[\]]+)\](.*)$/) { @@ -54,7 +61,7 @@ my ($pre,$k,$post) = ($1,$2,$3); if ($main::cache->{mem_lookup}->{$k}) { #print STDERR "## mem_lookup fetch $k == ".join("|",@{$main::cache->{mem_lookup}->{$k}})."\n"; - foreach my $v (@{$main::cache->{mem_lookup}->{$k2}}) { + foreach my $v (@{$main::cache->{mem_lookup}->{$k}}) { push @out,$pre.$v.$post; } } @@ -66,7 +73,8 @@ } } #print STDERR "mem_lookup dump: ",Dumper($main::cache->{mem_lookup}),"\n"; - return @out; +#print STDERR "out: ".Dumper(@out)."\n" if (@out); + return wantarray ? @out : shift @out; } 1;