eichbaum: Suche nach String in Hash / Ausgabe

Hallo Leute,

Ich finde einfach keine wirklich sinnvolle (und vor allem funktionierende) Lösung - und im Archiv habe ich auch nichts vergleichbares gesehen:

Ich versende mittels Formular mehrere verschiedene Feldeinträge, wobei einige der Felder einen standardisierten Namen haben:

name="Level2Feld10"

wobei die Zahlen am Ende durch Variablen erzeugt werden.

Das aufgerufene Skript liest alle Namen & Werte in einen Hash ein - jetzt möchte ich den Hash durchsuchen, besagte Feldeinträge ausfiltern und der Reihe nach mit zugehörigem Wert ausgeben. Suchkriterium wäre sinnigerweise "/Level2Feld/".

Jedoch hat all‚ mein Tun irgendwie keinen Taug - es läuft einfach nicht. Kann ich nicht einfach eine Schleife durchlaufen lassen, die die gefundenen Einträge ausgibt? Allerdings funktioniert meine Suche schon gleich gar nicht...

Vielleicht hat jemand einen Tip für mich.

Danke,
eichbaum

  1. Hi,

    Das aufgerufene Skript liest alle Namen & Werte in einen Hash ein

    warum läßt Du das nicht von CGI.pm erledigen? Dann hast Du alle Werte in param($name), bzw. kannst die Namen mit der Liste param auslesen.

    jetzt möchte ich den Hash durchsuchen, besagte Feldeinträge ausfiltern und [...]

    Vielleicht liegt es daran, daß ich nicht in Deiner Zielsetzung drinstecke, aber ich habe beim besten Willen nicht verstanden, was Du möchtest. Könntest Du das bitte noch mal näher erläutern?

    Cheatah

    1. Vielleicht liegt es daran, daß ich nicht in Deiner Zielsetzung drinstecke, aber ich habe beim besten Willen nicht verstanden, was Du möchtest. Könntest Du das bitte noch mal näher erläutern?

      Cheatah

      Sorry, Cheatah - ich weiß, daß ich mich etwas konfus ausdrücke (siehe mein Posting vom 13.10.). Liegt daran, daß ich zwar genau weiß, wo ich hin will, aber es in meinem Kopf nicht hinbekomme, einen anständigen Lösungsweg zu gehen...zu viele Gedankengänge plagen mein armes Hirn...

      Es geht um folgendes: auf Grundlage bestehender XML-Daten wird ein Formular erzeugt (XML gibt die Struktur vor). Dieses Formular enthält die vorgegebene Menge an Feldern (auf verschiedenen "Levels", sprich: Kapitel-Ebenen). Die Felder werden automatisch benannt ("Level2Feld$a$b") und mit einem voreingestellten Text gefüllt.
      Diese Felder soll der User bearbeiten und wieder abspeichern. Beim Speichern wird die XML-Datei mit den neuen Inhalten überschrieben - und beim nächsten Aufruf wird diese Datei wieder ausgelesen.

      Effekt: ich habe ein Tool zur automatischen, flexiblen Dokumentenerstellung (ist eine Studienarbeit).

      Und ich bekomme einfach den Dreh nicht `raus, wie es denn jetzt wirklich zufriedenstellend funktioniert. Manchmal ist der Knoten im Hirn wirklich hartnäckig...
      Klaus hat mir einen guten Tip gegeben - ich werde das gleich morgen früh ausprobieren (heute nun wirklich nicht mehr - auch wenn‚s mich reizt) und bei Interesse bescheid geben, ob‚s ging. In diesem Thread, versteht sich...

      Danke,
      eichbaum

  2. Hi,

    Kann ich nicht einfach eine Schleife durchlaufen lassen, die die gefundenen Einträge ausgibt?

    Leider weiss ich jetzt nicht, wie dein Hash genau aufgebaut ist, bzw. ob Du die keys oder die values durchsuchen willst.

    Ansonsten dürften die "keys" bzw. "values" Funktionen für Dich interessant sein.

    Beispiel:
    $hash{'Level2Feld10'} = 4;
    $hash{'Level2Feld11'} = 4;

    foreach $temp (keys %hash)
      {
       if (if $temp =~ /Level2Feld/i)    { push (@ergebnis, $temp); }
      }

    print join ("\n", @ergebnis);

    sollen die Hash-Werte anstatt der Schlüssel durchsucht werden, ersetzt Du einfach "keys" durch "values".

    Hoffe, dass das Dein Problem löst.
    fs

  3. Hallo,

    Wenn ich Dich richtig verstehe, willst Du eigentlich aus "Level2Feld10" herausbekommen, daß das Level x und das Feld y gemeint ist, um praktisch wieder den Zustand zu erreichen, den Du beim Aufbau des Formulars (es geht um XML-Dateien, falls ich mich richtig erinnere) gehabt hast.

    foreach my $key (keys %formularwerte) # [1] [3]
      {
      if($key =~ /^Level(\d+)Feld(\d+)$/) # [2]
       {
       my($level,$feld) = ($1,$2); # [2] [3] [4]
       &machwasmit($level,$feld,$formularwerte{$key}); [3]
       }
      }

    So ein Konstrukt würde für mich irgendwie Sinn ergeben, ich kann allerdings auch komplett falsch liegen.

    Grüße
      Klaus
    PS.:

    Hommage an cheatah :-):
    [1] perldoc -f foreach, perldoc -f keys [5]
    [2] perldoc perlre [6]
    [3] perldoc perlsub [6]
    [4] perldoc perlop [6]
    [5] perldoc perlfunc [6]
    [6] perldoc [7]
    [7] http://www.cpan.org/doc/index.html

    Ich hoffe, daß ich jetzt nichts vergessen habe.

    1. So ein Konstrukt würde für mich irgendwie Sinn ergeben, ich kann allerdings auch komplett falsch liegen.

      ABSOLUT!

      Mir dämmert was...

      Ich werde das gleich morgen früh ausprobieren - klingt vollkommen logisch.

      Wenn‚s Euch interessiert, poste ich Euch hier, wie es aussieht - und auch den Rest drumrum (ist eine Studienarbeit).

      Danke, Schönen Gruß,
      eichbaum

      1. So ein Konstrukt würde für mich irgendwie Sinn ergeben, ich kann allerdings auch komplett falsch liegen.

        ABSOLUT!

        Sorry Klaus - ich meinte natürlich, daß das Konstrukt ABSOLUT Sinn ergibt, nicht daß Du ABSOLUT falsch liegst...

        Nicht, daß Du das falsch verstehst...

        eichbaum

        1. Hallo,

          Sorry Klaus - ich meinte natürlich, daß das Konstrukt ABSOLUT Sinn ergibt, nicht daß Du ABSOLUT falsch liegst...

          Ich habe mich grad gefragt, auf was sich das absolut bezieht.

          Nicht, daß Du das falsch verstehst...

          Ich versteh' dich schon, aber _wie_ meinst Du das??? :-))

          Grüße
            Klaus

  4. Ich versende mittels Formular mehrere verschiedene Feldeinträge, wobei einige der Felder einen standardisierten Namen haben:

    name="Level2Feld10"

    Das aufgerufene Skript liest alle Namen & Werte in einen Hash ein - jetzt möchte ich den Hash durchsuchen, besagte Feldeinträge ausfiltern und der Reihe nach mit zugehörigem Wert ausgeben. Suchkriterium wäre sinnigerweise "/Level2Feld/".

    Den Sinn deines hashs sehe ich nicht. Hier ein Beispiel mit CGI.pm:

    ----------------------------------------------
    #!/usr/local/bin/perl -w

    use CGI ':standard';
    use strict;

    my @felder = grep /^Level2Feld/, param;
    ----------------------------------------------

    RTFM: "perldoc -f grep"

    Peter