Функция length() в Perl

В языке программирования Perl есть встроенная функция length(). Эта функция возвращает длину строки, которая передана аргументом в эту функцию.

Вот пример:

▶ Run
#!/usr/bin/perl

print( length('Hello') );

Эта программа выведет на экран число 5. В строке 'Hello' пять символов.

Аргументы

my $length = length($str);

Если функции length() передать один аргумент, то функция будет работать с ним.

Если не передать ни одного аргумента, то функция будет работать с дефолтной переменной $_. Вот пример (программа выведет число 4):

▶ Run
#!/usr/bin/perl

$_ = 'asdf';

print( length() );

Если функции length() передать больше чем один аргумент, то будет ошибка:

Too many arguments for length at script.pl line 3, near "'a') "
Execution of script.pl aborted due to compilation errors.

Возвращаемое значение

Функция length() возвращает либо undef, либо целое положительное число. Функция возвращает undef только если в нее передали undef.

Вот три программы, в каждой их них length() возвращает undef. Все они равнозначны.

▶ Run
#!/usr/bin/perl

use Data::Dumper;

warn Dumper length(undef);
▶ Run
#!/usr/bin/perl

use Data::Dumper;

$_ = undef;

warn Dumper length();
▶ Run
#!/usr/bin/perl

use Data::Dumper;

warn Dumper length();

Unicode

Функция length() возвращает количество символов в строке, а не количество байт, но нужно чтобы строка была с флагом, который говорит о том что в строке находится Unicode. Такой флаг появляется автоматически и у строк описанных в коде если в программе есть use utf8;. Вот программа, которая возвращает число 7 — это корректное количество символов в этой строке:

▶ Run
#!/usr/bin/perl

use utf8;

print( length('АБВГДЕЁ') );

Но если в программе нет use utf8;, то тогда строки определенные в программе считаются последовательностью байт и функция length() возвращает количество байт. Вот программа которая использует ту же строку что и в предыдущем примере, но эта программа отобразит на экране число 14 (в строке 7 букв, каждая буква занимает два байта):

▶ Run
#!/usr/bin/perl

print( length('АБВГДЕЁ') );

Примеры

Вот программа, которая показывает несколько примеров работы функции length():

▶ Run
#!/usr/bin/perl

use feature qw(say);

my $arr = [1, 2, 3];
my $hash = { a => 1 };
my $sub = sub { return 1 };

foreach my $var ('12', 12, 0xff, 0b1000, 'S', 'String', $arr, $hash, $sub ) {
    say $var . ' - ' . length($var);
}

Результат работы этой программы:

12 - 2
12 - 2
255 - 3
8 - 1
S - 1
String - 6
ARRAY(0x561a04e48578) - 21
HASH(0x561a04e60cf8) - 20
CODE(0x561a04e61370) - 20

Функция length() возвращает одно и то же значение для и для строки '12' и для числа 12 (число 2). Шестнадцатеричное число 0xff это 255 в десятеричной системе счисления и length() возвращает число 3. Точно так же работает и число записанное в двоичной системе счисления.

Функция length() нельзя использовать для того чтобы посчитать количество элементов в массиве или хеше. То как это сделать описано на страницах:

Для ARRAYREF и HASHREF функция length() возвращает количество символов в строках вида 'ARRAY(0x561a04e48578)'.

Официальная документация

Вот вывод команды perldoc -f length:

       length EXPR
       length  Returns the length in characters of the value of EXPR.  If EXPR
               is omitted, returns the length of $_.  If EXPR is undefined,
               returns "undef".

               This function cannot be used on an entire array or hash to find
               out how many elements these have.  For that, use "scalar
               @array" and "scalar keys %hash", respectively.

               Like all Perl character operations, length() normally deals in
               logical characters, not physical bytes.  For how many bytes a
               string encoded as UTF-8 would take up, use
               "length(Encode::encode_utf8(EXPR))" (you'll have to "use
               Encode" first).  See Encode and perlunicode.

Связанные темы

Другие статьи

Комментарии