文字列長の制限
文字列の長さを制限し、指定サイズを超過した部分を削除するには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関数
