Zwei Warnmeldungen

Hallo zusammen,
ich habe gerade mit Perl begonnen und laufe schon in ziemlich blöde Fehlermeldungen rein. Kann mir jemand bei dem folgenden Problem helfen?

#!/usr/bin/perl
# sort\_001.pl
use warnings;
#use strict;

@list\_of\_numbers = (1,98,34,2);
$greatest\_number;

foreach (@list\_of\_numbers) 
{
 print "$\_\n";
 if ($\_ \> $greatest\_number)
 {
 $greatest\_number = $\_
 }
}

print "\nGroesster Wert: $greatest\_number\n";

Funktional ist alles OK. Nur zwei Warnmeldungen stören mich:

D:\sort\_001.pl
Useless use of a variable in void context at D:\sort\_001.pl line 18.

1
Use of uninitialized value in numeric gt (&gt:wink: at D:\sort\_001.pl line 23.
98
34
2

Groesster Wert: 98

Die „Useless use of a variable …“-Meldung kann ich eleminieren, wenn ich auf die Deklaration verzichte. Will ich aber nicht, da ich auch zukünftig alle Variablen am Source-Anfang definieren möchte.

Die „Use of uninitialized value …“-Meldung kann ich eleminieren, wenn ich der Variable irgend einen (sehr kleinen) Wert zuweise. Dadurch kann ich mir aber die Korrektheit des Programms zerstören.

Habt ihr andere Vorschläge?

Gruß der Janus

Hallo,

schreibe statt

$greatest_number;

einfach

$greatest_number = 0;

Damit dürften beide Probleme gelöst sein, zumindest dann,
wenn die Liste grundsätzlich positive Zahlen enthält.
Falls auch negative Werte vorkommen können, solltest Du
entsprechend einen negativen Wert zuweisen, der unter der
kleinsten möglichen Zahl liegt.

Gruß,
Sascha

Hallo,
zuerst einmal vielen dank für deine Unterstützung.

Ich habe leider eine grundsätzliche Abneigung gegen das unnötige definieren von Grenzen, da diese i.d.R. einer problemlosen Wiederverwendbarkeit der Source im Wege stehen.

Trotzdem - was wäre den der kleinstmögliche Wert?

Gruß der Janus

Hi,

Damit dürften beide Probleme gelöst sein, zumindest dann,
wenn die Liste grundsätzlich positive Zahlen enthält.
Falls auch negative Werte vorkommen können, solltest Du
entsprechend einen negativen Wert zuweisen, der unter der
kleinsten möglichen Zahl liegt.

Es ist immer etwas problematisch, wenn man implizite Annahmen ueber den verwendendeten Zahlenraum macht.

Also:
entweder explizit sagen, welche Voraussetzungen das Programm hat („dieses Programm liefert aus einer Liste positiver Zahlen die groesste…“)

oder mit dem ersten Wert der Liste starten und ggf. einen Vergleich zuviel in Kauf nehmen.

In etwas so:

...
my @list\_of\_numbers = (1,98,34,2);
my $greatest\_number = $list\_of\_numbers[0];
foreach (@list\_of\_numbers)
{
 ... # usw. wie gehabt

gruss
bernhard

Ich habe leider eine grundsätzliche Abneigung gegen das
unnötige definieren von Grenzen, da diese i.d.R. einer
problemlosen Wiederverwendbarkeit der Source im Wege stehen.

Naja, dann kannst Du es so machen, wie von Bernhard vorgeschlagen,
den einen unnötigen Vergleich kann man wohl verschmerzen. Alternativ
könntest Du den Vergleichswert ja auch variabel halten, so dass er
von Fall zu Fall leicht angepasst werden kann. Wenn’s wiederverwendbar
sein soll, würde sich die Verwendung als Subroutine für den Codeschnipsel
anbieten, dann könnte der Vergleichswert als Argument übergeben werden.

Trotzdem - was wäre den der kleinstmögliche Wert?

Keine Ahnung. Auch die Man-Pages haben mich in dieser Frage nicht
sonderlich weitergebracht…

Gruß,
Sascha

Es ist immer etwas problematisch, wenn man implizite Annahmen
ueber den verwendendeten Zahlenraum macht.

Nicht, wenn der mögliche Zahlenraum vorher definitiv bekannt ist.
Ich habe deshalb ja auch ausdrücklich auf die Einschränkungen aufmerksam
gemacht.

Du ahnst gar nicht, wieviel Beispiele ich mir spontan ausdenken kann,
in denen niemals ein Wert kleiner als Null auftritt. :wink: Deine Lösung
finde ich aber trotzdem besser, weil sie universell verwendbar ist.

Gruß,
Sascha

Hallo zusammen,
ich habe gerade mit Perl begonnen und laufe schon in ziemlich
blöde Fehlermeldungen rein. Kann mir jemand bei dem folgenden
Problem helfen?

#!/usr/bin/perl

sort_001.pl

use warnings;
#use strict;

@list_of_numbers = (1,98,34,2);

my @list_of_numbers = (1,98,34,2);

$greatest_number;

my $greatest_number = $list_of_numbers[0];

foreach (@list_of_numbers)
{
print „$_\n“;
if ($_ > $greatest_number)
{
$greatest_number = $_
}
}

print „\nGroesster Wert: $greatest_number\n“;

Funktional ist alles OK. Nur zwei Warnmeldungen stören mich:

D:\sort_001.pl
Useless use of a variable in void context at D:\sort_001.pl

Sollte durch dir Zuweisung weg sein. Variablen deklariert man mit my, dann funktioniert auch use strict;

line 18.

1
Use of uninitialized value in numeric gt (&gt:wink: at
D:\sort_001.pl line 23.

Die Initialisierung der Variablen fehlt. Dank der Zuweisung sollte es gehen, ohne den Wertebereich einzuschränken.

Alexander

Danke an alle.
Vielen Dank für eure Unterstützung. Da ich erst am Anfang stehe werdet ihr bestimmt bald wieder von mir hören (und ich hoffentlich von euch).

Gruß der Janus