Stefan: Heraussuchen der Variable mit dem größten Wert

Hallo,

ich habe mal ein kleines Problem mit Perl.
Und zwar habe ich ein Pogramm, welches mehrere Variablen erstellt.

Die Variablen heißen z.B. "Deutsch", "Englisch" und "Italienisch".
Jede Variable hat als Wert eine Zahl. Nun soll Perl die Variable ausgeben, die den größten Wert hat.

Zur Anschauung mal ein kleines Beispiel. Mit zwei Variablen habe ich das Problem so gelöst :

if ($englisch < $deutsch) { print "Deutsch"; }
elsif ($englisch > $deutsch) { print "Englisch"; }

An sich ja ganz simpel. Nun ist es aber schwierig das Problem mit mehreren Variablen zu lösen, mit 3 mag es vielleicht noch so gehen, aber wenn noch mehr dazukommen vervielfacht sich die Zahl der Möglichkeiten ja. Bietet Perl da eine Möglichkeit sowas anders zu lösen ?

Danke für eure Hilfe.
Grüße,
Stefan

  1. Auch Hallo,

    also ich wuerde als erstes mal keine Skalare (einzelne Variablen) verwenden, sondern einen Array oder Hash den du dann mittels einer
    Schleife durchlaufen kannst. Am ehesten bietet sich hier, um bei deiner Variablenbezeichnung zu bleiben, ein Hash an.
    Also ich wuerds so loesen :

    use strict;

    my %H_Sprachen =(
       'Deutsch' => '3',
       'Englisch' => '1',
       'Franzoesisch' => '5',
       # Beliebig erweiterbar
    );

    my $temp=0;
    my $ergebnis;

    foreach my $sprache (keys %H_Sprachen)
    {
      if ($H_Sprachen{$sprache} > $temp)
      {
        $ergebnis = $sprache;
        $temp = $H_Sprachen{$sprache};
      }
    }

    In $ergebnis sollte nach durchlaufen des Hashes
    dann die Sprache stehen die den groessten Wert hat.

    Gruss
    Holger

    1. Hallo,

      und danke.
      Das löst mein Problem für's erste.

      Eine Sache noch: Was mache ich, wenn alle Variablen den selben Wert haben ?

      Dann sollte sowas wie "Ich bin mir nicht sicher" ausgegeben werden. Kann man das da noch irgendwie einbauen ?
      Falls nicht auch nicht so schlimm, du hast mir jedenfalls schon ein ganzes Stück weitergeholfen..

      Grüße,
      Stefan

      1. Hai.

        Eine Sache noch: Was mache ich, wenn alle Variablen den selben Wert haben ?
        Dann sollte sowas wie "Ich bin mir nicht sicher" ausgegeben werden. Kann man das da noch irgendwie einbauen ?

        use strict;
        use warnings;

        (...) [Definition]
        my ($temp, $ergebnis, $sprache)

        foreach $sprache (keys %H_Sprachen)
          {
           if (exists $H_Sprachen{$sprache})
            {
             $temp = -1;  #  oder irgendein anderer Wert, der nicht in der Definition steht.
             last;    # beendet die Schleife
            }
          if ($H_Sprachen{$sprache} > $temp)
            {
             $ergebnis = $sprache;
             $temp = $H_Sprachen{$sprache};
           }
        }

        if ($unsicher == -1)  { print "unsicher" };

        das müsste helfen.
        fs

        1. Ups,

          kleine Korrektur:

          if (exists $H_Sprachen{$sprache})

          muss natürlich heißen:
          if ($temp)
            {
             (...)
            }

          sorry
          fs

      2. Hi,

        Eine Sache noch: Was mache ich, wenn alle Variablen den selben Wert haben ?

        Das ist noch relativ einfach zu lösen.
        Schlimmer wird es, wenn *einige* Variablen denselben (größten) Wert haben ... (Beispiel: 1, 2, 2.) Ab wann beginnst Du, Dir "unsicher" zu sein?

        mfG - Michael

    2. Auch Hallo,

      Noch mal Hallo,

      auch wenn das hier bei dir funktioniert, es ist trotzdem ein sehr schlechter Programmierstil ... am Ende sogar falsch !
      (Die Perlgoetter moegen mich hier korrigieren, wenn's noetig ist)

      my %H_Sprachen =(
         'Deutsch' => '3',
         'Englisch' => '1',
         'Franzoesisch' => '5',
         # Beliebig erweiterbar
      );

      man sollte auch Zahlen in den HASH schreiben und keine Zahlen als String, sonst _koennte_ der Vergleich ins Auge gehn, es kann sein dass es hier gut ging, weil Perl eine Programmiersprache mit "impliziter Typenanpassung" (so nennt das studierte Informatikervolk das doch oder ?) ist, also dass ich im Prinzip mit Zahlen in einem String auch rechnen oder numerische Vergleiche anstellen kann.

      Also die saubere und richtige Loesung waehre demnach :

      my %H_Sprachen =(

      »»    'Deutsch' => 3,
      »»    'Englisch' => 1,
      »»    'Franzoesisch' => 5,
      »»    # Beliebig erweiterbar

      );

      Gruss
      Holger