Cyclamen BBS で記事題名切り詰めとして使っている処理を 汎用化したものです。 ・引数はsubstrと同じく、開始位置、文字長のいずれかを省略できます。 ・全角文字は2文字として数えます。 sub z_substr { local($s,$p,$l) = @_; $s =~ s/(.)/$1\0/g; $s =~ s/([\x81-\x9f\xe0-\xfc])\0(.)\0/$1$2\0\0/g; $s = $l eq '' ? substr($s,$p*2):substr($s,$p*2,$l*2); $s =~ tr/\0//d; $s; } #example. print &z_substr('全角文字',1,3) ."\n"; print &z_substr('全角文字',-4) ."\n"; print &z_substr('全角文字',,2) ."\n"; 処理概要