=for about ************************************************** Author = Robert Gleeson Title = BSD::BSDoogle E-mail = robert.gleeson3@gmail.com WWW = http://www.denlab.cn ************************************************** Description A Perl5 module that canused to interface with and search the Free,Net, and OpenBSD pkgsrc tree. =cut package BSD::BSDoogle; use strict; use warnings; use Exporter; our @ISA = ('Exporter'); our @EXPORT = qw(&openindex &search); # variables global to the module. my @content; # This subroutine attempts to open the file(INDEX FILE); sub openindex { # Read input passed to openindex(); my %input = @_; # Store passed input in $INDEX. my $INDEX = $input{'INDEX_FILE'}; # Attempt to open the BSD INDEX file. open(IDX, '<', $INDEX) or return('0'); @content = ; close(IDX); return ('1'); } # END OF openindex(); # This subroutine does the searching. sub search { # read input passed to search(); my %input = @_; # Three arrays that hold the search results, the results are push()'ed into arrays later on. my (@titles,@locations,@descriptions); # Three scalar variables that hold the input passed to search(); my ($title,$keyword,$case); # A variable that holds the regex to use for searching. my ($regex); # Check if the module was passed a title and/or a keyword to search for, if it has, add them to $title & $keyword # accordingly.. $title = $input{'TITLE'} if (exists($input{'TITLE'}) ); $keyword = $input{'KEYWORD'} if(exists($input{'KEYWORD'}) ); # Check if the search has been passed CASE_SENSITIVE='value', if it hasn't default to 'no' (case insensitive). if ( not exists($input{'CASE_SENSITIVE'} ) ) { $case = 'no' } else { $case = $input{'CASE_SENSITIVE'}; } # Loop through the content of INDEX file (@content). foreach my $entry (@content) { # split the INDEX file into $port,$location and $description my ($port,$location,undef,$description) = split(/\|/,$entry,4); # Make a case sensistive/insenstive search depending on the value of $case. # $case = 'no' means a case insensitive search, '1' means a case sensitive search. if($case eq 'no') { # TRUE if searching for just the title of a port. if(defined($title) && not defined($keyword) ) { $regex = $port =~ /$title/i; } # TRUE if searching for just the keyword/description of a port. elsif(defined($keyword) && not defined($title) ) { $regex = $description=~ /$keyword/i; } # TRUE if searching for both the keyword and description of a port. else { $regex = $port =~ /$title/i && $description =~ /$keyword/i;} } # do a case sensitive search. elsif($case eq 'yes') { # TRUE if searching for just the title of a port. if(defined($title) && not defined($keyword) ) { $regex = $port =~ /$title/; } # TRUE if searching for just the keyword/description of a port. elsif(defined($keyword) && not defined($title) ) { $regex = $description=~ /$keyword/; } # TRUE if searching for both the keyword and description of a port. else { $regex = $port =~ /$title/i && $description =~ /$keyword/;} } #true if there was a match in the search. # Time to add the results into an array of found ports. if($regex) { push (@titles,$port); push (@descriptions,$description); push(@locations,$location); } } # END OF foreach(); return(\@titles,\@descriptions,\@locations); } # END OF search(); 1;