半角を全角が混じった文字列を同じ幅でsubstrする

全角と半角が入った文字列を画面に表示するときに、substr()で単純に文字数できってしまうと、半角が混じった文字列の場合には短く表示される。半角が混じっている場合には半分の幅の文字が表示されることを考慮してsubstrするときにはどうしたらいいか?

ということで、べただけど、先頭から半角文字かどうか評価しながら処理することにしたのが以下。これを実行すると、
1234あいうえおかきくけこabcd
 ↓↓↓
1234あいうえおかきく
こうなる。複数の行にわたってくりかえせば、同じ幅の文字列を出力できる。

本当は正規表現でうまくできるのかもしれないけど。。。

なお、入力される文字列はUTF8フラグがたっていて、
utf8::is_utf8($string)
すると、1が返ること。もしかして、perl5.8限定の話かもしれない。

use utf8;

$test="1234あいうえおかきくけこabcd";
$len= ZenHanSubstr($test,0,10);
$test_new = substr($test,0,$len);

sub ZenHanSubstrlen {
 	my $content = $_[0];    #文字列
	my $start = $_[1];      #開始文字位置
	my $max = $_[2];        #全角相当文字数
	my $hancont=0;		#半角文字の数

	for($i=0;$i=$max+$hancont/2-1){
			last;
		}
	}
	my $resultlen = $max+$hancont/2;
	$resultlen =~ s/\.5//;  #.5があったら切り捨て
	return $resultlen;
}