push @{$main::cache->{mem_lookup}->{$k}}, $v;
#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 $pre|$prek|$k|$postk|$post == [".join("|",@keys)."]\n";
- foreach my $k2 (@keys) {
- 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;
+ } elsif (/\[[^\[\]]+\]/) {
+ # lookup [key] recursivly
+ my @in = ( $_ );
+#print STDERR "mem_lookup: $_\n";
+ while (my $f = shift @in) {
+ if ($f =~ /\[([^\[\]]+)\]/) {
+ my $k = $1;
+ if ($main::cache->{mem_lookup}->{$k}) {
+#print STDERR "mem_lookup key: $k = ";
+ foreach my $nv (@{$main::cache->{mem_lookup}->{$k}}) {
+#print STDERR "\t$nv\n";
+ my $tmp = $f;
+ $tmp =~ s/\[$k\]/$nv/g;
+ push @in, $tmp;
}
+ } else {
+ undef $f;
}
- }
-#print STDERR "## mem_lookup return values $pre\[$prek\[$k\]$postk\]$post == [".join("|",@out)."]\n";
-
- }
- } elsif (/^(.*)\[([^\[\]]+)\](.*)$/) {
- # direct lookup [key]
- 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}}) {
- push @out,$pre.$v.$post;
- }
+ } elsif ($f) {
+ push @out, $f;
+ }
}
-#print STDERR "## mem_lookup return values $k == ".join("|",@out)."\n";
-
} else {
# value is undef
#warn "mem_lookup: invalid filter specification: '$_'";