[Cologne-pm] $${VariablenName} funktioniert nicht immer

A. Pagaltzis pagaltzis at gmx.de
Wed Jun 18 09:58:23 CDT 2003


* Robert Meiser <Robert.Meiser at rrz.uni-koeln.de> [2003-06-17 10:13]:
> @Suchworte= Liste der im web tatsächlich ausgefüllten Felder
> (z.B. Vorname, Nachname...)
> foreach $Datei (readdir(..)) {
>   open $Datei
>   ($Vorname,$Nachname...)=split(':' $Datei)
>   close $Datei
> 
>   foreach $Suchwort (@Suchworte) {
> 
>     $Suchstring=$Suchwort."Suchstring";
> 
>       # ueberpruefe Suchstring z.B $Kennung !~ m/$KennungSuchstring/
>       # $$ fuer dynamische Variablennamen
>       if ($$Suchwort !~ m|^$$Suchstring$|i) { # Suchstring passt nicht
> 	$Matched = 'false';                # Flag fuer Trefferliste
> 	last;                              # naechste Datei
>       }
>     }
>     if ($Matched eq 'true') { # alle Suchworte passen => in Trefferliste
> nehmen
>       push @Trefferliste, (join (":", at Inhalt));
> 
>     }
>     $Trefferzahl=$#Trefferliste+1;
> 
>     # Eindeutiges Suchwort angegeben => Abbruch nach 1. Treffer
>     if (($Unique eq 'true') && ($Trefferzahl == 1)) {
>       $Zielkennung=shift(@Trefferliste);
>       &Infoseite($Formular,$Zielkennung);
>     }
>   }
> }

Der Code ist etwas zu Pseudo und verkürzt, um definitives sagen
zu können, aber prinzipiell würde ich hier das im Weiteren
erläuterte machen. Zunächst ist ein Hash die richtige Methode,
wird aber nur einmal am Anfang benötigt. Der sorgt für die
Zuordnung von Feldnamen zu -positionen:

my %field_for = (
    Vorname => 0,
    Nachname => 1,
    # ...
);

Dann wandle ich damit die Liste der Feldnamen die geprüft werden
sollen in Indizes um:

my @check_field = @field_for{@suchworte};

Einlesen eines Datensatzes:

foreach $filename (readdir(..)) {
    open my $fh, '<', $filename or die "$!\n";
    while(<$fh>) {
        my @record = split /:/, <$Datei>;

Jetzt nehme ich einfach die Indizes aus @check_field um die
gewünschten Felder abzuklappern:

        my $match; # $match ist undefiniert
        for(@record[@check_field]) {
            $match++, last if m/^$suchstring$/;
        }

Das eq 'true'/'false' kannst du dir übrigens sparen, 0 bzw undef
sind falsch, erhöhst du eine Variable, so wie oben mit ++, sodass
sie einen Betrag != 0 hat, ist sie wahr.

        if($match) {
            push @hits, $_;
            last if $unique;
        }        
    }
}

-- 
Gruss,
Aristoteles



More information about the Cologne-pm mailing list