diff options
-rw-r--r-- | op.c | 12 | ||||
-rw-r--r-- | t/op/smartmatch.t | 26 |
2 files changed, 37 insertions, 1 deletions
@@ -5542,6 +5542,18 @@ S_ref_array_or_hash(pTHX_ OP *cond) return newUNOP(OP_REFGEN, 0, mod(cond, OP_REFGEN)); + else if(cond + && (cond->op_type == OP_ASLICE + || cond->op_type == OP_HSLICE)) { + + /* anonlist now needs a list from this op, was previously used in + * scalar context */ + cond->op_flags |= ~(OPf_WANT_SCALAR | OPf_REF); + cond->op_flags |= OPf_WANT_LIST; + + return newANONLIST(mod(cond, OP_ANONLIST)); + } + else return cond; } diff --git a/t/op/smartmatch.t b/t/op/smartmatch.t index f8a073be56..f14e91ca94 100644 --- a/t/op/smartmatch.t +++ b/t/op/smartmatch.t @@ -73,7 +73,7 @@ my %keyandmore = map { $_ => 0 } @keyandmore; my %fooormore = map { $_ => 0 } @fooormore; # Load and run the tests -plan tests => 335; +plan tests => 351; while (<DATA>) { SKIP: { @@ -484,6 +484,30 @@ __DATA__ @nums { 1, '', 12, '' } ! @nums { 11, '', 12, '' } +# array slices + @nums[0..-1] [] + @nums[0..0] [1] +! @nums[0..1] [0..2] + @nums[0..4] [1..5] + +! undef @nums[0..-1] + 1 @nums[0..0] + 2 @nums[0..1] +! @nums[0..1] 2 + + @nums[0..1] @nums[0..1] + +# hash slices + @keyandmore{qw(not)} [undef] + @keyandmore{qw(key)} [0] + + undef @keyandmore{qw(not)} + 0 @keyandmore{qw(key and more)} +! 2 @keyandmore{qw(key and)} + + @fooormore{qw(foo)} @keyandmore{qw(key)} + @fooormore{qw(foo or more)} @keyandmore{qw(key and more)} + # UNDEF ! 3 undef ! 1 undef |