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

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

Вот пример:

▶ Run
#!/usr/bin/perl

use utf8;
use feature qw(say);

say ord('A'); # 65
say ord('1'); # 49
say ord('Ж'); # 1046

Аргументы

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

▶ Run
#!/usr/bin/perl

$_ = 'a';

print ord(); # 97

Стандартное использование функции – это передать ей ровно один символ. В этом случае функция вернет числовое значение этого символа. Если функции ord() передать строку, которая состоит из нескольких символов, то функция вернет числовое значение первого символа:

▶ Run
#!/usr/bin/perl

use feature qw(say);

say ord('a'); # 97
say ord('abcdef'); # 97

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

▶ Run
#!/usr/bin/perl

print ord('a', 'b', 'c');
Too many arguments for ord at script.pl line 3, near "'c')"
Execution of script.pl aborted due to compilation errors.

В том случае если передать в ord() пустую строку, то функция возвратит число 0:

▶ Run
#!/usr/bin/perl

print ord('');

Unicode

Вот пример программы в которой для одного и того же символа функция ord() возвращает разные значения:

▶ Run
#!/usr/bin/perl

use feature qw(say);

say ord('Ъ');

use utf8;

say ord('Ъ');

Программа выведет на экран:

208
1066

Первый вызов ord('Ъ') возвращает число 208. Так происходит из-за того что ord() воспринимает свой аргумент не как один символ, а как строку из двух байт 208 170 и возвращает номер для первого символа из этой строки.

Но после use utf8; perl считает что код программы написан в кодировке utf8 и ord() воспринимает свой аргумент не как строку из двух символов, а как строку из одного символа. И возвращает для него значение 1066.

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

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

    ord EXPR
    ord     Returns the numeric value of the first character of EXPR. If
            EXPR is an empty string, returns 0. If EXPR is omitted, uses $_.
            (Note *character*, not byte.)

            For the reverse, see "chr". See perlunicode for more about
            Unicode.

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