length関数 - 文字列の長さを取得
length関数を使用すると文字列の長さを取得するすることができます。
$ret = length $str;
たとえば「abcde」という文字列の長さは5になります。
# 文字列の長さは5 my $length = length 'abcde';
日本語の文字列の長さを正しく取得する
length関数は文字列の長さを返却しますが、日本語の文字列の長さを正しく取得するためには、覚えておかなければならないことがひとつあります。
それは、内部文字列に対して、length関数を使う必要があるということです。内部文字列というのはEncodeモジュールのdecode関数でデコードされた文字列のことです。
内部文字列については、以下の記事を参考にしてください。
以下にサンプルプログラムを載せておきます。
日本語のようなマルチバイトで表現される文字の場合は、Encodeモジュールのdecode関数で内部文字列に変換してから、length関数を使用すると、正しい結果が得られます。全角日本語を処理する場合も同じ考え方です。
use strict; use warnings; use Encode 'decode'; # 引数からUTF-8でエンコードされている文字列を取得 my $bytes = shift; # 文字列の長さを取得 my $string = decode('UTF-8', $bytes); my $length = length $string;
lengthでは配列の長さは取得できない
Perlのlength関数は文字列の長さを取得する関数で配列の長さを取得する関数ではないので注意してください。
配列の長さを取得するには、配列をスカラコンテキストで評価する必要があります。たとえば以下のようにします。
# 配列の個数 my $count = @nums;
スカラコンテキストについての詳しい解説は以下の記事をご覧ください。
Perl 5.10未満のlengthは未定義値を渡したときに警告を発生させる
Perl 5.10未満のlengthは未定義値を渡したときに警告を発生させます。なので、汎用的なモジュールでlengthを書きたい場合は次のように書くと警告が出ないようになります。
my $has_length = defined $foo && length $foo;
定義されているかどうかを確認してからlength関数に渡すようにする。
反対にPerl 5.12以上であれば、定義されていてかつ長さを持っているということがlength関数ひとつでかけるようになったとうことです。
my $has_length = length $foo;
業務アプリケーションで最新のPerlを使っている場合は、上記のように書くと簡潔です。
サンプルプログラム
length関数を使って、文字列の長さを取得するサンプルです。
# 文字列の長さを取得 my $message = "I like peace"; my $length = length $message;