Hör gärna av er om ni behöver hjälp.
Kommentarer och tips på förbättringar (gärna med motivering till varför det är en bättre lösning) är alltid välkommna. Speciellt som man börjar bli trött i skallen och kanske inte ser de självklara lösningarna längre. :)
Detta är vad jag hunnit med hittills (har bara arbetat med själva sökalgoritmen än så länge):
<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Perl-kod:<pre>
#!perl -w
# Copyright (C) 2000 Robert Hallgren, Lipogram.
# Färdigt script kommer att släppas som open source
# enligt samma vilkor som Perl självt.
use strict;
use Fcntl;
my $basepath = 'E:/Profiles/robert/Desktop/petra/drinkar/';
my @pages = (
'alkoholfritt.html',
'baler.html',
'champagne.html',
'gin.html',
'kaffe.html',
'konjak.html',
'likor.html',
'lattvin.html',
'rom.html',
'shots.html',
'tequila.html',
'vodka.html',
'whisky.html',
);
# Temporära sökvariabler tills vi fått rutin att ta emot formulärdata
my @SPRIT = ('Vodka');
my @VIRKE = ('*');
my @GLAS = ('*');
print "Content-Type: text/html";
# Loopa igenom alla sidor i @pages
foreach (@pages) {
# Kolla så att sidan ö.h.t. existerar
# Avsluta scriptet om så inte är fallet
die "Runtime error: $!" unless (-e "$basepath$_");
# Öppna sidan för läsning
# Avsluta scriptet om sidan inte gick att öppna
sysopen FILE, "$basepath$_", O_RDONLY or die "Runtime error: $!";
# Loopa igenom alla rader i den öppnade filen
while (<FILE> ) {
\# Leta efter drinkreceptens början
if (/\<!-- \*?drinkstart \*?--\>/i) {
\# Initiera variabel som används för temporär lagring av recept
my @drink = ();
\# Initiera tre variabler som används för att kontrollera ifall
\# kravet på ingredienser är uppfyllda. Om användaren angett \*
\# i något fält anses alla krav uppfyllda för den kategorin
my $sprit = 0;
$sprit = 1 if $SPRIT\[0\] eq '\*';
my $virke = 0;
$virke = 1 if $VIRKE\[0\] eq '\*';
my $glas = 0;
$glas = 1 if $GLAS\[0\] eq '\*';
\# Loopa igenom alla rader i drinkreceptet tills vi stöter på
\# receptets slut (eller att filen tar slut, vilket som nu kommer
\# först)
while (\<FILE\> ) {
last if (/\<!-- \*?drinkslut \*?--\>/i);
push @drink, $\_;
if (/\<drink +?type \*?= \*?\\"\*? \*?name \*?\\"\*? +?value \*?= \*?\\"(.\*?)\\"/i) {
# NAMNSÖK IN HÄR!!!
}
\# Kontrollera så att kraven när det gäller spritingredienser är
\# uppfyllda
if (!$sprit &&
(/\<drink +?type \*?= \*?\\"\*? \*?sprit \*?\\"\*? +?value \*?= \*?\\"(.\*?)\\"/i)) {
my @ingredienser = split /, ?/, $1;
my $ingrediens;
$sprit = 1;
foreach $ingrediens (@ingredienser) {
$sprit = 0 unless grep /$ingrediens/i, @SPRIT;
last if $sprit == 0;
}
}
\# Kontrollera så att kraven när det gäller virkesingredienser är
\# uppfyllda
if (!$virke &&
(/\<drink +?type \*?= \*?\\"\*? \*?virke \*?\\"\*? +?value \*?= \*?\\"(.\*?)\\"/i)) {
my @ingredienser = split /, ?/, $1;
my $ingrediens;
$virke = 1;
foreach $ingrediens (@ingredienser) {
$virke = 0 unless grep /$ingrediens/i, @VIRKE;
last if $virke == 0;
}
}
\# Kontrollera så att kraven när det gäller glasinnehav är uppfyllda
if (!$glas &&
(/\<drink +?type \*?= \*?\\"\*? \*?glas \*?\\"\*? +?value \*?= \*?\\"(.\*?)\\"/i)) {
my @ingredienser = split /, ?/, $1;
my $ingrediens;
$glas = 1;
foreach $ingrediens (@ingredienser) {
$glas = 0 unless grep /$ingrediens/i, @GLAS;
last if $glas == 0;
}
}
}
\# Om samtliga krav är uppfyllda skriver vi ut receptet som temporärt
\# sparats i @drink (annars kastas innehållet bort)
if ($sprit && $virke && $glas) {
local $, = "\\n";
print @drink;
}
}
}
# Stäng filen
close FILE;
}