develooper Front page | perl.perl5.porters | Postings from July 2000

[PATCH] allow non-variable as lhs of non-updating tr///

Thread Next
From:
M.J.T. Guy
Date:
July 31, 2000 05:28
Subject:
[PATCH] allow non-variable as lhs of non-updating tr///
Message ID:
E13JEgd-0003fy-00@libra.cus.cam.ac.uk
[ 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 patch

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About