----+----1----+----2----+----3----+-
substr('000000000000000000000000010000009397'(is_utf8=1),0,39)=
'000000000000000000000000010000009397^@7'(is_utf8=1)
- NevemTeve blogja
- A hozzászóláshoz be kell jelentkezni
- 693 megtekintés
Hozzászólások
if you assign something longer than LENGTH, the string will grow to accommodate
- A hozzászóláshoz be kell jelentkezni
Nyilván a megkönnyítés kedvéért a perl illetékes source-jába (pp.c), a <stdio.h> nincs beemelve, viszont valamilyen csodás define-ok vannak érvényben az fprintf-re és a stderr-re, a következő végtelenül elegáns módszerrel debuggolunk:
extern struct _IO_FILE *debfile __asm__("stderr"); extern void DEB(struct _IO_FILE *f, const char *fmt, ...) __asm__("fprintf");
...
DEB(debfile, "%s:%s:%d tmps='%s' utf8_curlen=%ld curlen=%ld\n", __FILE__, __func__, __LINE__, tmps, (long)utf8_curlen, (long)curlen);
Lett is egy ilyen:
----+----1----+----2----+----3----+-
pp.c:Perl_pp_substr:3299 tmps='000000000000000000000000010000009397' utf8_curlen=38 curlen=36
- A hozzászóláshoz be kell jelentkezni
If OFFSET and LENGTH specify a substring that is partly outside the string, only the part within the string is returned. If the substring is beyond either end of the string,
substr
returns the undefined value and produces a warning.
- A hozzászóláshoz be kell jelentkezni
Ez a derék yasql szépen sorban kéri a rekordokat a szervertől, mindegyiket méretre akarja vágni substr-vel (39-re, ami a maximum is), ennek során jutunk el ebbe a Perl_pp_substr-be, ahol, úgy tűnik, az utf8_curlen "örökre vasalva" van, szemben a curlen-nel, ami változik.
- A hozzászóláshoz be kell jelentkezni
Off: Nem tudom mondtam-e már, hogy milyen jó dolog a függvény bemenő paraméterét munkaváltozónak használni, nagyon megkönnyíti, hogy a függvény végére debugkiírást tegyünk.
utf8.c:Perl_utf8_length
2354 while (s < e) {
2355 s += UTF8SKIP(s);
2356 len++;
2357 }
- A hozzászóláshoz be kell jelentkezni
Nem akarom elkiabálni, de mintha lenne egy cache, ami meggyorsítja az utf8_strlen kiszámítását. Mondjuk igaz, optimalizációs szempontból gyorsan kapni rossz eredményt hatékonyabb, mint lassan kapni jó eredményt.
- A hozzászóláshoz be kell jelentkezni
A return 4; Raadasul a bemenetet sem kell, hogy validalja, szoval joval gyorsabb tud lenni.
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
Egyébként van egy perl -Ca
opció, ilyeneket tud mondani:
panic: sv_len_utf8 cache 38 real 36 for 000000000000000000000000010000009397 at ./yasql line 3165, line 1.
Google fogott egy ilyet, lehet, hogy hasznos https://github.com/Perl/perl5/issues/17221#issuecomment-546661584
- A hozzászóláshoz be kell jelentkezni
Na szóval van egy Perl_sv_setpvn
meg egy Perl_sv_setpvn_mg
. A kettő közötti különbség a SvSETMAGIC
(aminek a magja a Perl_mg_set
).
Namostan az a nagy kérdésem, hogy vajon a Perl_sv_setpvn
-t nem kellett-e volna deprekálni, és egységesen a Perl_sv_setpvn_mg
-t hívni helyette?
- A hozzászóláshoz be kell jelentkezni
Off: kezdem azt hinni, hogy azok az ihletett csodaprogramozók (avagy rockstar-coders), akik az ilyen `magic` dolgokat csinálják [nem ém nevezem így, a source-ban van benne], akkor tennék a legjobbat, ha elkerülnék a számítógépeknek még a környékét is.
- A hozzászóláshoz be kell jelentkezni
Ez most csak egy kis érdekesség: a ;vesszőpont a kommentben megzavarja a programot
Input:
-- this test uses NCHAR;
-- the result depends on NLS_NCHAR_CHARACTERSET (server-side) and NLS_NCHAR (client-side)
Output:
ORA-00900: invalid SQL statement (DBD ERROR: error possibly near <*>
indicator at char 23 in '-- this test uses NCHAR<*>')
Szerk: a csodaprogramozó a lexikális elemzést helyettesítette egy regex-szel (itt a 1149-es sortól). Köszönjük, Emese!
- A hozzászóláshoz be kell jelentkezni