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 教程。