ZetCode

Perl oct 函数

最后修改于 2025 年 4 月 4 日

Perl 的 oct 函数将八进制、十六进制或二进制的数字字符串表示形式转换为十进制。它根据字符串的前缀来解释它们。

oct 将以 0 开头的字符串视为八进制,以 0x 开头的视为十六进制,以 0b 开头的视为二进制。如果没有前缀,它将输入视为八进制。

基本 oct 用法

使用 oct 的最简单方法是使用八进制字符串。

basic.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $octal = "0755";
my $decimal = oct($octal);

print "Octal $octal is decimal $decimal\n";

我们将一个八进制字符串转换为其等效的十进制值。前导零向 Perl 表明是八进制表示法。

$ ./basic.pl
Octal 0755 is decimal 493

十六进制转换

oct 可以转换以 0x 为前缀的十六进制字符串。

hex.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $hex = "0xFF";
my $decimal = oct($hex);

print "Hexadecimal $hex is decimal $decimal\n";

此示例将十六进制颜色值转换为十进制。0x 前缀告诉 Perl 将其解释为十六进制。

$ ./hex.pl
Hexadecimal 0xFF is decimal 255

二进制转换

0b 为前缀的二进制字符串可以使用 oct 进行转换。

binary.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $binary = "0b1010";
my $decimal = oct($binary);

print "Binary $binary is decimal $decimal\n";

我们将二进制字符串转换为十进制。0b 前缀向 Perl 表明是二进制格式。

$ ./binary.pl
Binary 0b1010 is decimal 10

无前缀处理

如果没有前缀,oct 会假定字符串是八进制格式。

noprefix.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $num = "755";
my $decimal = oct($num);

print "String '$num' interpreted as octal: $decimal\n";

这演示了 oct 的默认八进制解释。没有前缀时,它将输入视为八进制数字。

$ ./noprefix.pl
String '755' interpreted as octal: 493

文件权限

oct 通常用于转换文件权限字符串。

permissions.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $mode = "0644";
my $decimal = oct($mode);

print "File mode $mode means decimal $decimal\n";
print "In binary: ", sprintf("%b", $decimal), "\n";

我们将一个常见的文件权限八进制字符串进行转换。结果以十进制和二进制格式显示实际的权限位。

$ ./permissions.pl
File mode 0644 means decimal 420
In binary: 110100100

错误处理

字符串中的无效字符会导致 oct 停止解析。

error.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $invalid = "0789";
my $decimal = oct($invalid);

print "Invalid octal '$invalid' converted to: $decimal\n";

这演示了 oct 在处理无效八进制输入时的行为。它在遇到第一个无效字符(本例中为 8)时停止。

$ ./error.pl
Invalid octal '0789' converted to: 7

列表上下文

oct 可用于列表操作进行批量转换。

list.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my @hex_values = ("0xFF", "0xAA", "0x10");
my @decimals = map { oct($_) } @hex_values;

print "Converted values: @decimals\n";

我们使用 mapoct 来一次性将十六进制字符串数组转换为十进制数字。

$ ./list.pl
Converted values: 255 170 16

最佳实践

来源

Perl oct 文档

本教程涵盖了 Perl 的 oct 函数,并通过实际示例演示了其在常见场景中的用法。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面有十多年的经验。

列出 所有 Perl 教程