ZetCode

Perl sprintf 函数

最后修改于 2025 年 4 月 4 日

Perl sprintf 函数根据格式说明符格式化字符串。它返回一个格式化后的字符串,而不是直接打印它。

sprintf 类似于 printf,但返回结果而不是输出它。它对于创建精确格式化的字符串很有用。

基本的 sprintf 用法

sprintf 最简单的用法是使用占位符格式化字符串。

basic.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $name = "Alice";
my $age = 28;

my $result = sprintf("Hello, %s. You are %d years old.", $name, $age);
print "$result\n";

此示例显示了基本的字符串和数字格式化。%s 用于字符串,%d 用于整数。该函数返回格式化后的字符串。

$ ./basic.pl
Hello, Alice. You are 28 years old.

数字格式化

sprintf 提供对数字格式化的精确控制。

numbers.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $pi = 3.1415926535;
my $price = 19.99;

my $formatted = sprintf("Pi: %.2f\nPrice: %08.2f\nHex: 0x%x", $pi, $price, 255);
print $formatted;

我们使用不同的规范格式化数字:%.2f 显示 2 位小数,%08.2f 用零填充,%x 转换为十六进制。

$ ./numbers.pl
Pi: 3.14
Price: 0019.99
Hex: 0xff

字符串填充和对齐

可以使用宽度说明符对字符串进行填充和对齐。

padding.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "Perl";
my $left = sprintf("|%-10s|", $text);
my $right = sprintf("|%10s|", $text);
my $center = sprintf("|%*s|", 10 - length($text), $text);

print "$left\n$right\n$center\n";

%-10s 左对齐,%10s 右对齐。中心对齐需要手动计算。负宽度会左对齐文本。

$ ./padding.pl
|Perl      |
|      Perl|
|   Perl|

日期和时间格式化

sprintf 对于格式化日期和时间组件很有用。

datetime.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
$year += 1900;
$mon += 1;

my $date = sprintf("%04d-%02d-%02d %02d:%02d:%02d",
    $year, $mon, $mday, $hour, $min, $sec);
print "Current date/time: $date\n";

我们使用零填充来格式化日期/时间组件。每个数字使用 %02d 精确获得 2 位数字,确保格式一致。

$ ./datetime.pl
Current date/time: 2025-04-04 14:30:15

十六进制和二进制输出

sprintf 可以将数字转换为不同的基数。

bases.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $num = 255;
my $hex = sprintf("Hex: 0x%x 0x%X", $num, $num);
my $bin = sprintf("Bin: %b", $num);
my $oct = sprintf("Oct: %o", $num);

print "$hex\n$bin\n$oct\n";

格式说明符:%x 用于小写十六进制,%X 用于大写十六进制,%b 用于二进制,%o 用于八进制。

$ ./bases.pl
Hex: 0xff 0xFF
Bin: 11111111
Oct: 377

浮点精度

精度控制对于科学和金融计算至关重要。

precision.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $value = 123.456789;
my $sci = sprintf("%.3e", $value);
my $fixed = sprintf("%.2f", $value);
my $general = sprintf("%g", $value);

print "Scientific: $sci\nFixed: $fixed\nGeneral: $general\n";

%e 用于科学计数法,%f 用于定点表示法,%g 用于“智能”最短表示法。精度跟在小数点后面。

$ ./precision.pl
Scientific: 1.235e+02
Fixed: 123.46
General: 123.457

复杂格式化

sprintf 可以处理带有多个值的复杂格式化。

complex.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my @data = (
    ["Alice", 28, 45000.50],
    ["Bob", 32, 52000.75],
    ["Charlie", 45, 68000.00]
);

foreach my $row (@data) {
    my $line = sprintf("%-10s %2d years \$%8.2f", @$row);
    print "$line\n";
}

这会使用对齐的列来格式化一个表:左对齐的名称,带填充的右对齐数字。美元符号在格式字符串中被转义。

$ ./complex.pl
Alice      28 years $45000.50
Bob        32 years $52000.75
Charlie    45 years $68000.00

最佳实践

来源

Perl sprintf 文档

本教程通过实际示例介绍了 Perl 的 sprintf 函数,演示了其强大的字符串格式化功能。

作者

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

列出 所有 Perl 教程