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]"
In reply to Re: Side Effects
by ikegami
in thread Side Effects
by goodgulf
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |