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

Robert Meiser Robert.Meiser at rrz.uni-koeln.de
Tue Jun 17 05:10:18 CDT 2003


On Thu, 12 Jun 2003, A. Pagaltzis wrote:
> Ich empfehle jedem, der sich noch nicht hundertprozentig klar
> ist, was das heisst, sich den folgenden Artikel zu geben:
>
> http://perl.plover.com/FAQs/Namespaces.html

Danke! Sehr aufschlußreich.


> Und warum verwendest du symbolische Referenzen, wenn es je nach
> Zweck der Übung entweder harte Referenzen oder ein Hash auch
> täten? Symbolische Referenzen für etwas zu verwenden, was sich
> ohne sie lösen lässt, ist fast immer... nunja, wenig klug.

$$X war die erste Möglichkeit die mir eingefallen ist. Wusste wie gesagt
gar nicht, daß das eine spezielle Bedeutung hat. Hab erst jetzt gelernt
was symbolische Referenzen sind.

> Wenn du uns mehr erzählst, lässt sich mit Sicherheit ein sauberer
> und wartbarer Ersatz finden.

Ok ihr habts nicht anders gewollt ;-)

Aufgabe: Suchformular auf Webseite mit verschiedenen Suchkriterien. '*'
als Joker erlaubt (wird später durch .* ersetzt und direkt als RegEx
verwendet). Datenbasis ist ein Verzeichnis mit etwa 3000 Dateien. Jede
Datei hat eine Zeile mit ':'-getrennten Feldern,  die mit den
eingegebenen Suchkriterien verglichen werden sollen. Ergebnis soll eine
Ergebnisseite sein in der man einen einzelnen Eintrag anklicken kann um
sich Detailinformationen anzeigen zu lassen.

Derzeitige Lösung:
@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);
    }
  }
}

Alternativ wäre natürlich denkbar zwei Hashs mit den gleichen
keys(=Feldnamen) zu benutzen.
Etwas unglücklich ist natürlich die Vorgabe mit den 3000 Dateien als
Datenquelle.
Sorry wenn ich euch mit soviel Code zuschmeisse. Bin mir auch nicht
sicher ob die angewandte Methode sehr effizient, sinnvoll, oder
überhaupt richtig ist. Deshalb bin ich Jedermann und -frau für (auch
grundsätzliche) Verbesserungsvorschläge dankbar.

Alles Gute
Robert




More information about the Cologne-pm mailing list