[Moscow.pm] Странности и неожиданности Perl

Alexander Alekseev alex на alemate.ru
Ср Фев 27 06:05:31 PST 2008


 		Hello!

On Wed, 27 Feb 2008, Denis Evdokimov wrote:

>>>  ====
>>  #!/usr/bin/perl -w
>>  use strict;
>>  print $_ for ('a' .. 'я');
>>  ====
>>  ("а" -- латиница, "я" - кириллица)
>
>Мне кажется, это баг...
>и я реально не понимаю, как он может выдавать такой результат

 	"'Я' бывают разные!" (C) советский мультик.
$perl  ~/t.utf8.pl
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz
$
$perl  ~/t.cp1251.pl 
a b c d e f g h i j k l m n o p q r s t u v w x y z
$

 	В первом случае - очевидно именно так устроена таблица символов
UTF-8. А скрипт такой:

$perl -MO=Deparse ~/t.utf8.pl
use strict 'refs';
print $_ . ' ' foreach ('a' .. "\321\217");
print "\n";


 	Видимо всё дело в 'magical auto-increment algorithm' (perlop):
------------------------------
..
The range operator (in list context) makes use of the magical
auto-increment algorithm if the operands are strings.  You can say

            @alphabet = ('A' .. 'Z');

        to get all normal letters of the English alphabet, or

            $hexdigit = (0 .. 9, 'a' .. 'f')[$num & 15];

        to get a hexadecimal digit, or

            @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.
------------------------------
 	Дальше (видимо) надо смотреть исходники. Он же 'magical' !


 		Bye. Alex.


Подробная информация о списке рассылки Moscow-pm