On Thu, Jun 08, 2006 at 05:56:13PM +0900, Dan Kogai wrote:
> On Jun 08, 2006, at 17:34 , Yitzchak Scott-Thoennes wrote:
> >Which part should be fixed?
> 
> The limitation of the magic, namely....
> >
> >The key part is that magical auto-increment is defined earlier as
> >only working for strings matching "/^[a-zA-Z]*[0-9]*\z/".
> 
> Which is described in "Auto-increment and Auto-decrement", though  
> "Range Operator" does mention.
> 
> perldoc perlop
> >       The range operator (in list context) makes use of the  
> >magical auto-
> >       increment algorithm if the operands are strings.
> 
> This would make lawyers happy enough but not (Uni)?coders like  
> myself.  With the advent of Unicode support more people would attempt  
> things like ("\N{alpha}" .. "\N{omega}") and wonder why it does not  
> work like ("a".."z").  So we should add something like;
> 
> =head2 CAVEAT
> 
> Note that the range operator cannot apply magic beyond C<[a-zA-Z0-9] 
> >.  Therefore
> 
>   use charnames 'greek';
>   my @greek_small =  ("\N{alpha}" .. "\N{omega}");
> 
> Does not work.  If you want non-ascii ranges, try
> 
>   my @greek_small =  map { chr } ( ord("\N{alpha}") .. ord("\N 
> {omega}") );
> 
> On the other hand, ranges in regexp and C<tr///> works.  You may  
> consider this inconsistent but range operator must accept variables  
> like <tt>($start .. $end)</tt> while character ranges in regexp is  
> constant.

Hmm, we don't seem to document even what something like "+" .. "-"
does.  How does this look:

--- perl/pod/perlop.pod.orig    2006-05-15 09:48:33.000000000 -0700
+++ perl/pod/perlop.pod 2006-06-08 02:30:45.500000000 -0700
@@ -648,10 +648,22 @@
 
     @z2 = ('01' .. '31');  print $z2[$mday];
 
-to get dates with leading zeros.  If the final value specified is not
-in the sequence that the magical increment would produce, the sequence
-goes until the next value would be longer than the final value
-specified.
+to get dates with leading zeros.
+
+If the final value specified is not in the sequence that the magical
+increment would produce, the sequence goes until the next value would
+be longer than the final value specified.
+
+If the initial value specified isn't part of a magical increment
+sequence (that is, matching "/^[a-zA-Z]*[0-9]*\z/"), only the initial
+value will be returned.  So the following will only return an alpha:
+
+    use charnames 'greek';
+    my @greek_small =  ("\N{alpha}" .. "\N{omega}");
+
+Use this instead:
+
+    my @greek_small =  map { chr } ( ord("\N{alpha}") .. ord("\N{omega}") );
 
 Because each operand is evaluated in integer form, C<2.18 .. 3.14> will
 return two elements in list context.

Reply via email to