Schrift
[thread]7881[/thread]

Array-Indexzugruff nicht erkannt?: Use of uninitialized value in string ne



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Herr_Cisie
 2006-04-12 13:23
#64758 #64758
User since
2006-04-10
17 Artikel
BenutzerIn
[default_avatar]
Hallo!

Ich benutze "use strict;" in meinem Skript, und bekomm beim Indexzugriff auf ein array folgende Fehlermeldung:

Use of uninitialized value in string ne at ...

Der angesprochene Auszug sieht so aus:
Code: (dl )
1
2
3
4
5
6
foreach (@datei) {
 my @zeile = split(/, /, $_);
 if ($zeile[1] ne $alt){
   &tuwas;
   $alt = $zeile[1];
 }


In @datei befindet sich der Inhalt einer Datei, in der foreach-Schleife wird in @zeile die aktuelle Zeile an den Kommas getrennt eingelesen. Wenn der aktuelle Wert von $zeile[1] nicht dem alten Wert (in $alt) entspricht, passiert dann was ;-)

Die Zeile mit
Code: (dl )
 if ($zeile[1] ne $alt) 
wird von der Warnung angemeckert.
Warum? @zeile ist doch korrekt mit my definiert!
Hat es überhaupt was mit dem Indexzugriff zu tun? Es wird ja ein "string ne", also mein Vergleichsoperator angemahnt...

Kann mir jemand bitte kurz auf die Sprünge helfen?
bloonix
 2006-04-12 13:31
#64759 #64759
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hi Herr_Cisie,

$zeile[1] ist leer. In deiner Split-Anweisung wird nur $zeile[0]
"gefüllt", wenn der String in $_ im Schleifen durchlauf kein ", "
enthält.

Greez,
opi

Edit:

Quote
Ich benutze "use strict;" in meinem Skript


sehr löblich!\n\n

<!--EDIT|opi|1144834458-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2006-04-12 13:31
#64760 #64760
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das schon, aber vielleicht ist das Array leer und wo kommt das $alt überhaupt her? Ist das vielleicht nicht initialisiert? Vielleicht hast Du einfach nur irgendwo ein my $alt; stehen, ohne dass Du es vor der if-Abfrage initialisierst.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Herr_Cisie
 2006-04-12 14:15
#64761 #64761
User since
2006-04-10
17 Artikel
BenutzerIn
[default_avatar]
Halloho!

Vielen Dank für Eure Antworten!

$alt ist nicht leer, wird mit my $alt = "NULL"; initialisiert.
Entschuldigt bitte, war in den Code-Schnippseln nicht zu erkennen.

Hm, das mit der leeren @zeile ist ne Idee! Mir ist gerade aufgefallen, dass die erste Zeile in der Datei tatsächlich leer ist *schähm*
Ich bau mal noch ein if ein, und teste das ganze!


Gruß,
Christoph

PS: Ich bin echt erstaunt über den freundlichen Umgangston hier! Bin da von nem anderen Perl-Unterforum ganz anders gewohnt (auf jede Frage "rtfm":angry:)
Gefällt mir hier!\n\n

<!--EDIT|Herr_Cisie|1144836998-->
Ronnie
 2006-04-12 15:17
#64762 #64762
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=Herr_Cisie,12.04.2006, 12:15]Hm, das mit der leeren @zeile ist ne Idee! Mir ist gerade aufgefallen, dass die erste Zeile in der Datei tatsächlich leer ist *schähm*
Ich bau mal noch ein if ein, und teste das ganze![/quote]
Code: (dl )
next unless @zeile;

wäre auch eine Möglichkeit.
Herr_Cisie
 2006-04-12 15:44
#64763 #64763
User since
2006-04-10
17 Artikel
BenutzerIn
[default_avatar]
Interessant.
Das bedeutet also, dass immer wenn @zeile keinen Inhalt hat, der nächste Schleifendurchlauf angestoßen wird.

Elegante Lösung, vielen Dank!
bloonix
 2006-04-12 15:49
#64764 #64764
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Ronnie,12.04.2006, 13:17]
Code: (dl )
next unless @zeile;

wäre auch eine Möglichkeit.[/quote]
nicht ganz, da noch immer der gleiche Fehler ausgelöst wird,
wenn $zeile[1] leer ist und $zeile[0] nicht. Besser wäre da

Code: (dl )
next unless $zeile[1];


da $zeile[1] abgefragt wird...

Code: (dl )
if ($zeile[1] ne $alt){
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2006-04-12 16:37
#64765 #64765
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
man kann das auch in die if-Bedingung mit einbauen:
Code: (dl )
if(defined $zeile[1] && $zeile[1] ne $alt){
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2006-04-12 18:49
#64766 #64766
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ist defined wirklich das richtige Maß der Dinge hier? Ok, das wird vielleicht etwas philosophisch, aber theoretisch könnte man auch undefined Werte ablegen im Array (das passiert hier zwar nicht, ist aber machbar).

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\>perl
@a = (0, undef, 2);
print "anzahl: ", scalar(@q), "\n";
if (defined $a[1]) {
print "ja\n";
}
use Data::Dumper;
print Dumper \@a;
^Z
anzahl: 0
$VAR1 = [
0,
undef,
2
];


Vielleicht sollte man 1 <= #$array noch mit einbauen? Andererseits ists vielleicht auch egal, ob die Position im Array nicht belegt ist oder ob dort undef steht. Hmmm =)

Will man dazwischen unterscheiden, kann man exists verwenden:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C:\>perl
@a = (0, undef, 2);
print "anzahl: ", scalar(@q), "\n";
if (exists $a[1]) {
print "ja\n";
}
use Data::Dumper;
print Dumper \@a;
^Z
anzahl: 0
ja
$VAR1 = [
0,
undef,
2
];
\n\n

<!--EDIT|Crian|1144853538-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2006-04-12 19:31
#64767 #64767
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
man kann hier schon defined als Maß nehmen, da es mit undef auch die Warnung gibt...

Code: (dl )
1
2
3
4
C:\Dokumente und Einstellungen\Renee>perl -Mwarnings -e "my @a = (undef,undef); if($a[0] eq $a[1]){print 'hallo'}"
Use of uninitialized value in string eq at -e line 1.
Use of uninitialized value in string eq at -e line 1.
hallo
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-04-12 13:23.