Use of uninitialized value in pattern match (m//)

Hi,

Sorry wenn der Titel ein wenig komisch ist, aber mir ist da nix besseres eingefallen :wink:

ich hab hier ein Perlscript, indem ich

#!c:\perl\bin\perl -w

$| = 1;
use strict;

gesetzt hab. Nun meckert er an der folgenden Stelle:

while (chomp (my $temp = )) {
 my ($zeit,$output) = split (" ",$temp,2);
 if ($output =~ /^(\)/ or $output =~ /^(\*\*\*\ )/) ## 
und folgende Fehlermeldung kommt dabei heraus:


    Use of uninitialized value in pattern match (m//) at e:\www\intern\cgi-bin\winbotlog.pl line 42, line 1


Es ist keine abbruchsmeldung, d.h. er führt das Script korrekt aus, nur kommt die Meldung bei jedem Schleifendurchlauf, was da ca mal eben an die mehreren hundert mal ist...

Was mache ich in der Zeile da falsch?

Gruß
Martin

Du hast perl mit der Option -w gestartet (in der Kommandozeile oder in #!/usr/bin/perl -w).
Perl gibt dann Warnungen aus, wenn ihm etwas „unsauber“ oder unsicher erscheint.
Deine Meldung bedeutet, daß du eine Variable benutzt ohne sie vorher zu intialisieren. wie zum Bsp:

#!/usr/bin/perl -w
my $var; print $var;

im Gegensatz zu

#!/usr/bin/perl -w
my $var=""; print $var;

Perl besetzt nicht initialisierte Variablen automatisch mit „“(string), 0 numerisch, leer (liste).

Es ist also nicht wirklich ein Problem. Wenn dich die Warnungen nerven. -w entfernen.

oder probiers mal mit $output="" in der Zeile vorher.

holli

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

mhh…
ich weise der Variable doch bei Erstellung schon einen Wert zu. Also initialisiere ich doch die Variable:

my ($zeit, $output) = split (" ",$temp,2);

naja, dann mach ich das -w eben weg. Dachte nur, es gäbe eine elegantere Möglichkeit, bzw. einen Weg die Variable zu „bearbeiten“ das diese Meldung eben nicht kommt.

ok, danke :smile:

Gruß
Martin

Was mache ich in der Zeile da falsch?

In der Zeile nichts was direkt mit dem Problem zu tun hat.
Versuch es mal so:

while () {
 chomp $\_;
 my ($zeit,$output) = split (/\s\s/,$\_,2);
 if (defined $output) { # 

Dann geht's auch mit -w und use strict;
Die eigentlich Ursache ist, dass wenn der Ausdruck keine zwei Leerzeichen " " enthält, split nur die Variable $zeit setzt und dann ist $output leer (nicht defined)

Im Übrigen brauchst Du hier nicht zu quoten:
statt /^(\)/
langt auch /^()/
und hier /^(\*\*\*\ )/ wäre folgender Ausdruck besser:
/^(\*{3}\s)/

Klaus

axooo

Die eigentlich Ursache ist, dass wenn der Ausdruck keine zwei
Leerzeichen " " enthält, split nur die Variable $zeit setzt
und dann ist $output leer (nicht defined)

*groschenfall* ahjaa :smile: Jetzt hab ich das auch verstanden :smile: hehe
Danke für den Tipp, es funktioniert prima so!

und hier /^(***\ )/ wäre folgender Ausdruck besser:
/^(*{3}\s)/

Auch hierfür danke :smile: es sieht so doch etwas geschickter aus :smile:

Gruß
Martin