bugfixes and improvements: skip MARC databases that can't be opened,
[webpac] / filter / mem_lookup.pm
index 3b5e534..d193356 100644 (file)
@@ -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 @@ sub mem_lookup {
                        # 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 @@ sub mem_lookup {
                        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 @@ sub mem_lookup {
                }
        }
 #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;