http://d.hatena.ne.jp/end0tknr/20090316/1237158571
以前、書いた \p{In〜}によるblock正規表現に関連する内容です。
「use utf8;」の場合、全角or半角に関わらず1文字として扱ってしまうので、次のように書けば、全角=2文字,半角=1文字で文字列長を算出できます。
#!/usr/local/bin/perl use strict; use utf8; main(); sub main { my @STRS = qw/123 東京 東京123/; for my $str (@STRS){ my @not_asciis = $str =~ /[^\p{InBasicLatin}]/go; my $ret_len = length($str) + scalar(@not_asciis); print STDERR "$ret_len\n"; } }
ん? 待てよ。次のようにEncode::encode()を使っても良い気がします。
#!/usr/local/bin/perl use strict; use utf8; use Encode; main(); sub main { my @STRS = qw/123 東京 東京123/; for my $str (@STRS){ my $ret_len = length(encode('cp932',$str)); print STDERR "$ret_len\n"; } }