Thread Fehlersuche Skript gibt falsche Warnungen aus (14 answers)
Opened by hcx at 2011-08-03 12:08

FIFO
 2011-08-04 07:25
#151144 #151144
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Hi, wie Linuxer ja schon erklärt hat, musst Du die Reihenfolge der if-Bedingungen beachten (die größte Zahl zuerst):

Code (perl): (dl )
1
2
3
if ($used > 90) { ... }
elsif ($used > 80) {... }
elsif ($used > 50) { ... }


Der Aufruf von Mail::Sender->new() macht so keinen Sinn, die eckigen Klammern in der Doku des Moduls sollen kenntlich machen, dass die Argumente fakultativ sind. Deine Version erzeugt eine Liste '()' mit genau einem Element, nämlich einem anonymen Hash '{}', dieses hat als Elemente eine zufälligerweise gerade Anzahl von Array-Referenzen (anonymen Arrays) '[]'. Ersetz mal die Kommata hinter dem 1., 3. usw. Element durch den (äquivalenten [edit: s. unten]) Pfeil, dann siehst Du folgenden Aufbau:

Code (perl): (dl )
1
2
3
4
5
{
    [from => 'system@gmx.net'] => [mail => 'mail.gmx.net'],
    [authid => 'hcx@gmx.net']  => [authpwd => 'geheim'],
    [debug => $DEBUG]          => [auth => 'LOGIN']
}


Das ist dasselbe wie:
Code (perl): (dl )
1
2
3
4
5
{
    ['from', 'system@gmx.net'] => ['mail', 'mail.gmx.net'],
    ['authid', 'hcx@gmx.net']  => ['authpwd', 'geheim'],
    ['debug', $DEBUG]          => ['auth', 'LOGIN']
}


Das ergibt zwar keine Fehlermeldung (Arrayreferenzen sind ja Skalare), ist aber sicher nicht gewünscht.

Schau Dir am besten mal 'perldoc perlreftut' und 'perldoc perldsc' an.
Besser ist (vgl. renee) ohnehin die 'direkte' Objektsyntax, also das Aufrufen des Konstruktors mit
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
my $mailsender = Mail::Sender->new(
{
    from    => 'system@gmx.net',
    mail    => 'mail.gmx.net',
    authid  => 'hcx@gmx.net',
    authpwd => 'geheim',
    debug   => $DEBUG,
    auth    => 'LOGIN'
}
);


Hier gibst Du dem Konstruktor eine Hashreferenz (ein anonymes Hash) als Argument.

Gruß FIFO

edit: zur Pfeil- vs. Kommanotation: Der Pfeil ist wie ein Komma, heißt auch 'fat comma', bewirkt aber ein automatisches Quoten des linken Operanden, wenn dieser ein bareword ist. (foo => $bar) ist also äquivalent zu ('foo', $bar)

Editiert von FIFO: Pfeil/Komma klarer, perlreftut
Last edited: 2011-08-04 09:32:50 +0200 (CEST)
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"

View full thread Fehlersuche Skript gibt falsche Warnungen aus