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