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
最佳实践
- 验证输入: 确保数据与格式说明符匹配。
- 使用常量: 将复杂的格式字符串存储为常量。
- 考虑区域设置: 数字格式因地区而异。
- 错误检查: 验证 sprintf 不返回 undef。
- 性能: 对于简单情况,字符串连接可能更快。
来源
本教程通过实际示例介绍了 Perl 的 sprintf 函数,演示了其强大的字符串格式化功能。
作者
列出 所有 Perl 教程。