(AND
(OR
AUTHOR=John PROFIT=90%
AUTHOR=Matt PROFIT=80%
)
PUBLISHER=OReilly
)
####
Page 1
AUTHOR: John
PROFIT: 20%
PUBLISHER: TMH
BOOK: OPERATING SYSTEMS
Page 2
AUTHOR: John
PROFIT: 90%
PUBLISHER: OREILLY
BOOK: ALGORITHMS
Page 3
AUTHOR: Matt
PROFIT: 80%
PUBLISHER: TMH
BOOK: COMPUTER NETWORKS
Page 4
AUTHOR: Matt
PROFIT: 80%
PUBLISHER: OREILLY
BOOK: COMMUNICATION SYSTEMS
####
#! perl -slw
use strict;
## Convert query syntax to evalable Perl code
sub buildQuery {
local $_ = uc shift;
while( m[ \( (?: AND | OR ) | != | = ]x ) {
s< ( [^!=()\s]+ ) ( != | = ) ( [^()\s]+ ) >{
my $op = ( $2 eq '!=' ? 'ne' : 'eq' );
"[\$\L$1\E $op '$3']";
}xge;
s< \( \s* ( AND ) \s+ ( \[ [^()]+ \] ) \s+ ( \[ [^()]+ \] ) \s
+* \) >
{ "[$2 && $3]" }xge;
s< \( \s* ( OR ) \s+ ( \[ [^()]+ \] ) \s+ ( \[ [^()]+ \] ) \s*
+ \) >
{ "[$2 || $3]" }xge;
}
tr/[]/()/;
return $_;
}
## Read data and UPPER case
my $data = do{ local $/; uc };
## Some variables
my( $author, $profit, $publisher, $book );
## And a regex to populate them from each record
my $re = qr[
PAGE \s+ \d+ \s+
AUTHOR: \s+ ( [^\n]+ ) (?{ $author = $^N }) \s+
PROFIT: \s+ ( [^\n]+ ) (?{ $profit = $^N }) \s+
PUBLISHER: \s+ ( [^\n]+ ) (?{ $publisher = $^N }) \s+
BOOK: \s+ ( [^\n]+ ) (?{ $book = $^N }) \s+
]x;
## Covert the query NOTE: (AND ) syntax is required
## where example used implicit AND
my $query = buildQuery( <##
print $db_title."\n";
print $db_source."\n";
print $db_length."\n";
print $db_author."\n";
print $db_body."\n";
print $db_language."\n";
print $db_subject."\n";
print $db_datepub."\n";
print $db_loaddate."\n";
print "\n\n\n";