文字列長の制限


 文字列の長さを制限し、指定サイズを超過した部分を削除するにはsubstrを使います。
 文字列の長さが、指定サイズを超過しているかどうかをチェックするにはlengthを使います。
# 超過部分を削除
$hoge = 'abcdefghijklmn';
$fuga = substr $hoge, 0, 10;
print $fuga, "\n";

# 超過しているかをチェック
if (length $foo > 10) {
	return 0;
}
 日本語を含む文字列の場合には以下の関数を使います。
# EUC用文字列長制限関数
sub strlen_limit_euc {
	my $str = shift;	# 文字列
	my $limit = shift;	# 最大長
	
	if (length($str) <= $limit) {
		return $str;
	}
	
	my $limited_str = '';
	my $str_len = 0;
	
	while( $str =~ m/(
		[\x00-\x7F]|
		[\x8E\xA1-\xFE][\xA1-\xFE]|
		\x8F[\xA1-\xFE][\xA1-\xFE]
		)/gx
	) {
		my $chr = $1;
		my $len = length $chr;
		if ($limit < $str_len + $len) {
			last;
		}
		$limited_str .= $chr;
		$str_len += $len;
	}
	return $limited_str;
}

# Shift JIS用文字列長制限関数
sub strlen_limit_sjis {
	my $str = shift;	# 文字列
	my $limit = shift;	# 最大長
	
	if (length($str) <= $limit) {
		return $str;
	}
	
	my $limited_str = '';
	my $str_len = 0;
	
	while( $str =~ m/(
		[\x00-\x7F\xA1-\xDF]|
		[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]
		)/gx
	) {
		my $chr = $1;
		my $len = length $chr;
		if ($limit < $str_len + $len) {
			last;
		}
		$limited_str .= $chr;
		$str_len += $len;
	}
	return $limited_str;
}
 また、文字数で制限をする場合は以下の関数を使います。
# EUC用文字列数制限関数
sub strnum_limit_euc {
	my $str = shift;	# 文字列
	my $limit = shift;	# 最大数
	
	return '' if ($limit < 0);
	
	my $limited_str = '';
	my $cnt = 0;
	
	while( $str =~ m/(
		[\x00-\x7F]|
		[\x8E\xA1-\xFE][\xA1-\xFE]|
		\x8F[\xA1-\xFE][\xA1-\xFE]
		)/gx
	) {
		$cnt++;
		$limited_str .= $1;
		if ($limit <= $cnt) {
			last;
		}
	}
	return $limited_str;
}

# Shift JIS用文字列数制限関数
sub strnum_limit_sjis {
	my $str = shift;	# 文字列
	my $limit = shift;	# 最大数
	
	return '' if ($limit < 0);

	my $limited_str = '';
	my $cnt = 0;
	
	while( $str =~ m/(
		[\x00-\x7F\xA1-\xDF]|
		[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]
		)/gx
	) {
		$cnt++;
		$limited_str .= $1;
		if ($limit <= $cnt) {
			last;
		}
	}
	return $limited_str;
}

関連項目

length関数
substr関数