in reply to Side Effects
Unlike foreach loops, while does not localize $_. In your code, $_ must be an alias to $g::TaskList[0], like $array[0] is in the following code:
@array = ('a'); foreach (@array) { # $_ is an alias for $array[0]. while (<DATA>) { } # $_ and $array[0] are clobbered print("[$_]$/"); # Prints "[]" } print("[$array[0]]$/"); # Prints "[]"
The fix is to localize $_:
@array = ('a'); foreach (@array) { # $_ is an alias for $array[0]. local $_ = $_; # This $_ is not an alias for $array[0]. while (<DATA>) { } # $_ is clobbered, but not $array[0] print("[$_]$/"); # Prints "[]" } print("[$array[0]]$/"); # Prints "[a]"
If you want to preserve $_ within the loop, use:
@array = ('a'); foreach (@array) { # $_ is an alias for $array[0]. { local $_; # This $_ is not an alias for $array[0]. while (<DATA>) { } } # Neither $_ nor $array[0] are clobbered print("[$_]$/"); # Prints "[a]" } print("[$array[0]]$/"); # Prints "[a]"
or:
@array = ('a'); foreach (@array) { # $_ is an alias for $array[0]; while (my $line = <DATA>) { } # Neither $_ nor $array[0] are clobbered print("[$_]$/"); # Prints "[a]" } print("[$array[0]]$/"); # Prints "[a]"
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Side Effects
by goodgulf (Initiate) on Apr 07, 2005 at 19:50 UTC | |
by ikegami (Patriarch) on Apr 07, 2005 at 19:57 UTC | |
by goodgulf (Initiate) on Apr 07, 2005 at 20:18 UTC |