[ I sent this to perlbug and got ID 20000730.002 but it didn't get through to p5p. So I'm resending it direct to p5p. ] As noted by Bart Lateur / Larry Rosler on comp.lang.perl.misc, while the tr/// operator no longer complains if it is just counting and the lhs is read-only, it still insists that the lhs is syntactically a variable. The attached patch for bleadperl fixes this. Mike Guy --- ./op.c.orig Mon Jul 24 18:46:48 2000 +++ ./op.c Sun Jul 30 14:30:22 2000 @@ -1988,7 +1988,9 @@ right->op_type == OP_SUBST || right->op_type == OP_TRANS)) { right->op_flags |= OPf_STACKED; - if (right->op_type != OP_MATCH) + if (right->op_type != OP_MATCH && + ! (right->op_type == OP_TRANS && + right->op_private & OPpTRANS_IDENTICAL)) left = mod(left, right->op_type); if (right->op_type == OP_TRANS) o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right); --- ./t/op/tr.t.orig Tue Jul 11 22:19:23 2000 +++ ./t/op/tr.t Sun Jul 30 14:33:40 2000 @@ -5,7 +5,7 @@ unshift @INC, "../lib"; } -print "1..23\n"; +print "1..27\n"; $_ = "abcdefghijklmnopqrstuvwxyz"; @@ -145,4 +145,21 @@ eval "tr/m-d/ /"; print (($@ =~ /^Invalid \[\] range "m-d" in transliteration operator/) ? '' : 'not ', "ok 23\n"); + +# 24: test cannot update if read-only +eval '$1 =~ tr/x/y/'; +print (($@ =~ /^Modification of a read-only value attempted/) ? '' : 'not ', + "ok 24\n"); + +# 25: test can count read-only +'abcdef' =~ /(bcd)/; +print (( eval '$1 =~ tr/abcd//' == 3) ? '' : 'not ', "ok 25\n"); + +# 26: test lhs OK if not updating +print ((eval '"123" =~ tr/12//' == 2) ? '' : 'not ', "ok 26\n"); + +# 27: test lhs bad if updating +eval '"123" =~ tr/1/1/'; +print (($@ =~ m|^Can't modify constant item in transliteration \(tr///\)|) + ? '' : 'not ', "ok 27\n"); End of patchThread Next