I discovered the problem:

  print "Yes r\n" if "0" =~ /0/;
  print "Yes s\n" if "0" =~ "0";

printed only "Yes s"

The problem is NOT in the RE engine, but in the string literal code in
P6C/Tree/String.pm

I replaced some "if ($stuff)" with "if (defined $stuff)" and now it
works. The problem was that a string "0" is false, but it's not the
same as "" (which would get used instead).

Proof:

 print "0";print "\n";

prints an empty line.

I attach a small patch: it's quite possible that by adding 'defined'
in several places I broke something else. People familiar with the
code will undoubtedly correct my patch.

-- 

        Dakkar - <Mobilis in mobile>

Index: String.pm
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/P6C/Tree/String.pm,v
retrieving revision 1.2
diff -u -r1.2 String.pm
--- String.pm   6 Sep 2002 07:55:58 -0000       1.2
+++ String.pm   8 Oct 2002 09:28:54 -0000
@@ -60,7 +60,7 @@
     my ($list) = shift;
     my @flat;
     foreach my $item (@$list) {
-        if ($item) {
+        if (defined $item) {
             if (ref $item eq 'ARRAY') {
                     push (@flat, interpolate_expand($item))
             }
@@ -83,13 +83,13 @@
 #      something weird done to them.
 
         if (ref $item eq 'P6C::variable') {
-            push (@short, escape($string)) if $string;
+            push (@short, escape($string)) if defined $string;
             push (@short, $item->tree);
             $string='';
         }
         elsif (ref $item eq 'P6C::interpolated_value') {
 
-            push (@short, escape($string)) if $string;
+            push (@short, escape($string)) if defined $string;
             push (@short, $item->tree);
             $string='';
 
@@ -97,7 +97,7 @@
         else { $string.=$item }
     }
 
-    push (@short, escape($string)) if $string;
+    push (@short, escape($string)) if defined $string;
 
     return \@short
 }
@@ -119,7 +119,8 @@
     }
     else {
         return new P6C::sv_literal type => $type,
-           lval => ($list->[0] || '""')
+           #lval => ($list->[0] || '""')
+           lval => (defined $list->[0] ? $list->[0] : '""')
     }
 }
 

Reply via email to