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

В языке программирования Perl есть встроенная функция oct().

Функция oct() преобразует число из восьмеричной системы счисления в десятеричную. Но еще эта функция умеет преобразовывать числа в десятеричную систему счисления и из двоичной и из шестнадцатеричной.

Вот пример:

▶ Run
#!/usr/bin/perl

use feature qw(say);

say oct('10'); # 8
say oct('0x10'); # 16
say oct('0b10'); # 2

Аргументы

В том случае если функции oct не переданы никакие аргументы, то функция работает с дефолтной переменной $_:

▶ Run
#!/usr/bin/perl

$_ = 123;

print oct(); # 83

В том случае если в переменной $_ находится undef и используется use warnings;, то будет предупреждение:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $dec = oct();
Use of uninitialized value $_ in oct at script.pl line 6.

Стандартное использование функции oct() — это передать ей один аргумент.

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

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

Если необходимо преобразовать несколько значений, то можно использовать map:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @oct = (100, 200, 300);

my @dec = map { oct } @oct;

warn Dumper \@dec;

Если в функцию передана строка, которая начинается с 0x или 0X, то функция oct() воспринимает эту строку как число в шестнадцатеричной системе счисления и возвращает это число в десятичной системе.

А если строка начинается с 0b или OB, то ord() считает эту строку числом в двоичной системе счисления и также возвращает его десятеричное представление.

В том случае если в oct() передать число в котором есть символ, который не входит в диапазон цифр от 0 до 7, то oct() вернет 0, но при включенных use warnings; будет предупреждение:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

say oct(90210);
Illegal octal digit '9' ignored at script.pl line 7.
0

Функция oct() не умеет работать с дробными значениями:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

say oct('10.7');
say oct('0X10.F');
say oct('0B10.11');
8
16
2
Illegal hexadecimal digit '.' ignored at script.pl line 8.
Illegal binary digit '.' ignored at script.pl line 9.

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

Функция oct() всегда возвращает число.

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

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

    oct EXPR
    oct     Interprets EXPR as an octal string and returns the corresponding
            value. (If EXPR happens to start off with "0x", interprets it as
            a hex string. If EXPR starts off with "0b", it is interpreted as
            a binary string. Leading whitespace is ignored in all three
            cases.) The following will handle decimal, binary, octal, and
            hex in standard Perl notation:

                $val = oct($val) if $val =~ /^0/;

            If EXPR is omitted, uses $_. To go the other way (produce a
            number in octal), use "sprintf" or "printf":

                my $dec_perms = (stat("filename"))[2] & 07777;
                my $oct_perm_str = sprintf "%o", $perms;

            The "oct" function is commonly used when a string such as 644
            needs to be converted into a file mode, for example. Although
            Perl automatically converts strings into numbers as needed, this
            automatic conversion assumes base 10.

            Leading white space is ignored without warning, as too are any
            trailing non-digits, such as a decimal point ("oct" only handles
            non-negative integers, not negative integers or floating point).

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

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