トップ «前の日記(■2009-01-31) 最新 次の日記(■2009-02-19)» 編集

どんぞこ日誌

2003|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|07|08|12|
2007|01|04|08|12|
2008|01|02|03|04|06|07|08|10|11|12|
2009|01|02|04|05|06|07|08|09|11|12|
2010|01|03|04|07|08|10|11|12|
2011|01|02|03|04|05|06|07|08|10|12|
2012|01|02|03|05|06|07|08|09|10|
2013|01|02|07|08|09|
2014|08|09|
2015|08|
2016|06|07|12|
2017|01|03|08|
2018|03|
2022|03|
2023|03|
2024|02|

同人関連(どんぞこ楽屋) | 旧い雑文   


■2009-02-16

* [Perl] Template::Stash::XS使用時のlengthB!

 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とVmethodのlength続き (■2009-02-19 21:21)

先日の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-..