summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Garcia-Suarez <rgarciasuarez@gmail.com>2004-02-04 19:50:05 +0000
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2004-02-04 19:50:05 +0000
commitaabe9514ecdf64c885843e2a9440477e5a96d4c8 (patch)
treef63a69f14007384f868ad26cf79a2e9f2b0c9800
parent1c00c3fe7fa040233dde55d9b3aee6515bd7106c (diff)
downloadperl-aabe9514ecdf64c885843e2a9440477e5a96d4c8.tar.gz
The "my $_" wasn't nice with foreach loops.
p4raw-id: //depot/perl@22268
-rw-r--r--op.c9
-rw-r--r--t/op/mydef.t19
2 files changed, 26 insertions, 2 deletions
diff --git a/op.c b/op.c
index 62d9b0307b..83c6fc18db 100644
--- a/op.c
+++ b/op.c
@@ -3721,7 +3721,14 @@ Perl_newFOROP(pTHX_ I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *blo
Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
}
else {
- sv = newGVOP(OP_GV, 0, PL_defgv);
+ I32 offset = pad_findmy("$_");
+ if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS(offset) & SVpad_OUR) {
+ sv = newGVOP(OP_GV, 0, PL_defgv);
+ }
+ else {
+ padoff = offset;
+ iterpflags = OPpLVAL_INTRO; /* my $_; for () */
+ }
}
if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
expr = mod(force_list(scalar(ref(expr, OP_ITER))), OP_GREPSTART);
diff --git a/t/op/mydef.t b/t/op/mydef.t
index 700a3dc5f7..0770e78f0b 100644
--- a/t/op/mydef.t
+++ b/t/op/mydef.t
@@ -5,7 +5,7 @@ BEGIN {
@INC = '../lib';
}
-print "1..56\n";
+print "1..64\n";
my $test = 0;
sub ok ($$) {
@@ -66,6 +66,23 @@ $_ = "global";
ok( our $_ eq 'global', '...our $_ restored outside for my $_' );
}
{
+ my $_ = 'local';
+ for ("implicit foo") { # implicit "my $_"
+ ok( $_ eq "implicit foo", 'for implicit my $_' );
+ /(.)/;
+ ok( $1 eq "i", '...m// in for implicity my $_' );
+ ok( our $_ eq 'global', '...our $_ inside for implicit my $_' );
+ }
+ ok( $_ eq 'local', '...my $_ restored outside for implicit my $_' );
+ ok( our $_ eq 'global', '...our $_ restored outside for implicit my $_' );
+}
+{
+ my $_ = 'local';
+ ok( $_ eq "postfix foo", 'postfix for' ) for 'postfix foo';
+ ok( $_ eq 'local', '...my $_ restored outside postfix for' );
+ ok( our $_ eq 'global', '...our $_ restored outside postfix for' );
+}
+{
for our $_ ("bar") {
ok( $_ eq "bar", 'for our $_' );
/(.)/;