Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9056[/thread]

Zuweisung klappt nur genau jedes 2. Mal: ...und ich weiß sogar warum



<< >> 2 Einträge, 1 Seite
dukeofnukem
 2007-06-01 16:19
#77176 #77176
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
Alohá!

Habe hier ein seltsames Problem, und nachdem ich mein posting schon fertig hatte, hab ich noch mal rumgetestet und RTFM betrieben und siehe da:

Quote
A (file)glob evaluates its (embedded) argument only when it is starting a new list. All values must be read before it will start over. In list context, this isn't important because you automatically get them all anyway. However, in scalar context the operator returns the next value each time it's called, or undef when the list has run out. As with filehandle reads, an automatic defined is generated when the glob occurs in the test part of a while , because legal glob returns (e.g. a file called 0) would otherwise terminate the loop. Again, undef is returned only once. So if you're expecting a single value from a glob, it is much better to say

($file) = <blurch*>;

than

$file = <blurch*>;

because the latter will alternate between returning a filename and returning false.


Also ist die Lösung klar, trotzdem bin ich voll reingelaufen. Gibt es Gute Gründe ™ für dieses Verhalten von glob?

Entnervt, aber erleichtert dachte ich mir, warum nicht andere von meinen Fehlern profitieren lassen.
Vielleicht wußte der eine oder andere genau das noch nicht...
drum&bass is a state of mind
Dubu
 2007-06-02 18:10
#77177 #77177
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ja, es gibt gute Gründe. Eine der häufigsten Anwendungen dürfte in einer Schleife sein:
Code: (dl )
1
2
3
while (my $file = <foo*>) {
  # mach was mit $file
}

Hier sollte <foo*> bei jeder Iteration den nächsten Treffer liefern, und undef, wenn kein Treffer mehr gefunden wird.

Es gibt aber keine explizite Resetfunktion für den glob-Operator. Daher setzt sich die Funktion nach einem undef selber wieder zurück, damit man die Schleife wieder neu durchlaufen kann.\n\n

<!--EDIT|Dubu|1180793468-->
<< >> 2 Einträge, 1 Seite



View all threads created 2007-06-01 16:19.