Perl : Useless use of private variable in void context

N

Nano

Foren As
Hi ich habe folgende Warnung und komme der sache nicht ganz auf die spur


Useless use of private variable in void context at Line 40

das entspricht bei mir
Code:
                for($i; $i < $#array; $i++){
                         if( $array[$i] =~ /^[A-Z a-z]+:$/ ){
                                $i--;
                                last;
                        }
                        $string .= $array[$i];
                } # ZEILE 40!!!

der fehler taucht im programm etwas später wieder auf, im web konnte ich dazu nichts aussagekräftiges finden jemand meinte etwas von einem bug,...
 
in so'ner c-like for-schleife solltest du dem $i im ersten "feld" einen wert zuweisen. (traditionellerweise 0)
Code:
my $i;
for ([b]$i = 0[/b]; $i < 100; $i++) {print "omg\n"}

-> klick or die <-

generell hat perl ne ziemlich gute dokumentation:
perldoc
sind alles manpages die man auch problemlos über die kommandozeile abrufen/querien etc. kann. (wenn perldoc installiert ist..)

[edit]:
also wenn du im ersten feld nichts mit dem $i machen willst, lass es einfach komplett leer..
Code:
my $i = 0;
for (; $i < 100; $i++) {print "zja!\n"}
dann gibts auch keine warnung, denn wenn du den link oben inzwischen gelesen hast, solltest du nun wissen, dass für perl das hier:
Code:
for ($i; $i < 10; $i++){...}
dasselbe wie das hier ist:
Code:
[b]$i;[/b]
while($i < 10){ ...} continue {$i++;}
ich finde das zeigt schön was perl dir bereits gesagt hat: diese anweisung ($i;) ist völlig sinnlos und macht nichts (:
 
Zuletzt bearbeitet:
klasse danke , ja die aussage war schon recht klar aber ich wusste nicht das $i in der forschleife nicht geht wenn $i vorher inizialisiert wurde
 
Naja, du benutzt doch $i dann gleich und woher soll der Perl-Interpreter wissen, wo es losgeht? Die for-Schleife muss ja nicht mit 0 beginnen. Die kann ja auch mit -5.5 beginnen. Oder sonstwas.
 
Hallo
Soetwas lässt sich natürlich auch unter Verwendung der Default-Variable schreiben.
Code:
print "xyz$_\n" for (0..100);

Wolfgang
 
In diesem Beispiel aber eher kontraproduktiv. Wenn die Schleife per last beendet wird, wird die Variable hier nochmal um eins dekrementiert, offensichtlich also weiterverwendet. Und da es viele Funktionen gibt, die $_ veraendern, kann das leicht kaputt gehn. Meiner bescheidenen Meinung nach sollte man $_ so oft es geht vermeiden, aber das darf gerne anders gesehn werden.
 
Für flüchtige Variablen ist $_ genau das Richtige.
Ein einfacher Counter für eine feste Anzahl von Schleifendurchläufen bedarf nicht extra einer weiteren Variable.
Zumahl auch soetwas geht:
Code:
my $cn=100;
print "xyz$_\n" for (0..$cn);
Und da es viele Funktionen gibt, die $_ veraendern, kann das leicht kaputt gehn.
Das sind immer locale Vars:
Beispiel: sogar das geht:
Code:
my $i=10;
for (1..20){print "xyz$_\n" for (0..$i)};

Gruß Wolfgang
 
Wie gesagt, aus dem Dekrementieren von $i in des OPs Code wuerde ich schliessen, dass $i noch von Belang ist (sonst waere die Dekrementierung ueberfluessig) und somit nicht fluechtig.
Das andere ist halt Geschmackssache. Ich versuche $_ und Konsorten gerade deshalb so oft wie moeglich zu vermeiden, weil der Quelltext sonst wie "line noise" aussieht.
 

Ähnliche Themen

[Perl] Perl OO Methodenaufruf in anderem Objekt

dovecot und postfix Konfiguration Problem

NagiosGrapher 1.7.1 funktioniert nicht

Falsche Rechte gesetzt beim Anlegen von Ordnern via Samba-Client

CentOS 6.3 RADIUS - Keine Verbindung möglich

Zurück
Oben