■2009-02-16
* [Perl] Template::Stash::XS使用時のlength
template-toolkitでunicode文字列に対してバーチャルメソッドlengthを使うと、文字数ではなく、バイト数が返ってきて、でもsplitとかmatchとかはちゃんとunicodeに対する動作をしてます。
だいたいTemplate::VMethods::text_length自体呼ばれてないし、ってなわけで色々試してたら、Template::Stash::XSを使ったときだけ生じるので、Stash.xsをみたらscalar_dot_lengthで定義されてました。
use strict;
use utf8;
use Template;
my $tmpl = Template->new();
my $ret = '';
my $body =<<BODY;
length -- [% str.length %]
split_size -- [% str.split('').size %]
BODY
$tmpl->process( \$body, { str => 'あいうえお' }, \$ret );
↑本当は両方5になると思うのだけど、Stash::XSを利用している場合はlengthが15。で、下記のようなパッチ(Template-2.20)をあてたのですが、これって今まで問題にならなかったのかしら? あるいは私が何か勘違いをしているのか……
--- xs/Stash.xs.bak 2009-02-16 11:20:09.000000000 +0900
+++ xs/Stash.xs 2009-02-16 11:41:15.000000000 +0900
@@ -1125,8 +1125,16 @@
/* scalar.length */
static SV *scalar_dot_length(pTHX_ SV *sv, AV *args) {
STRLEN length;
+#if PERL_VERSION >= 8 /* Perl 5.8 and later */
+ if ( SvUTF8(sv) ) {
+ length = sv_len_utf8( sv );
+ }
+ else {
+ length = sv_len( sv );
+ }
+# else
SvPV(sv, length);
-
+# endif
return sv_2mortal(newSViv((IV) length));
}
本日のTrackBacks(全1件)
[]
先日のTemplate::Stash::XS使用時のlengthで、unicodeに対応するようパッチをあててみたのですが、そもそもscalar_dot_length使わなくてもよいんじゃないかという気がしてきて、 --- xs/Stash.xs 2009-02-19 14:33:44.000000000 +0900 +++ xs2/Stash_del_len.xs 2009-02-..

