Heraussuchen der Variable mit dem größten Wert
Stefan
- perl
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
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
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
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
Ups,
kleine Korrektur:
if (exists $H_Sprachen{$sprache})
muss natürlich heißen:
if ($temp)
{
(...)
}
sorry
fs
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
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