Perl printf 函数
最后修改于 2025 年 4 月 4 日
Perl 的 printf
函数根据格式字符串生成格式化输出。它类似于 C 的 printf,并提供精确的控制。
printf
接受一个格式字符串,后跟要插入的值。格式指定了每个值应如何显示,包括宽度、精度和对齐。
基本 printf 用法
最简单的 printf
使用占位符格式化字符串。
basic.pl
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $name = "Alice"; my $age = 28; printf("Name: %s, Age: %d\n", $name, $age);
此示例演示了基本的字符串 (%s) 和十进制 (%d) 格式化。占位符按顺序被相应的变量替换。
$ ./basic.pl Name: Alice, Age: 28
数字格式化
printf
提供了广泛的数字格式化选项。
numbers.pl
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $price = 19.99; my $quantity = 5; my $total = $price * $quantity; printf("Price: \$%.2f\n", $price); printf("Quantity: %03d\n", $quantity); printf("Total: \$%8.2f\n", $total);
我们将浮点数格式化为 2 位小数,用前导零填充整数,并控制字段宽度以进行对齐。
$ ./numbers.pl Price: $19.99 Quantity: 005 Total: $ 99.95
字符串格式化
字符串格式化控制字段宽度、填充和对齐。
strings.pl
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $item1 = "Notebook"; my $item2 = "Pen"; my $price1 = 2.99; my $price2 = 1.49; printf("%-15s \$%5.2f\n", $item1, $price1); printf("%-15s \$%5.2f\n", $item2, $price2);
-
标志将字符串左对齐在 15 个字符的字段中。数字在 5 个字符的字段中右对齐,并保留 2 位小数。
$ ./strings.pl Notebook $ 2.99 Pen $ 1.49
十六进制和八进制输出
printf
可以以不同基数显示数字。
bases.pl
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $num = 255; printf("Decimal: %d\n", $num); printf("Hexadecimal: %x\n", $num); printf("Hexadecimal (uppercase): %X\n", $num); printf("Octal: %o\n", $num); printf("With prefixes: %#x %#o\n", $num, $num);
%x
和 %X
格式输出十六进制,%o
输出八进制。#
标志添加基数前缀(十六进制为 0x,八进制为 0)。
$ ./bases.pl Decimal: 255 Hexadecimal: ff Hexadecimal (uppercase): FF Octal: 377 With prefixes: 0xff 0377
科学计数法
大数或小数可以显示为科学计数法。
scientific.pl
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $avogadro = 6.02214076e23; my $electron_mass = 9.10938356e-31; printf("Avogadro's number: %.4e\n", $avogadro); printf("Electron mass: %.4e kg\n", $electron_mass); printf("Alternative format: %.4g\n", $avogadro);
%e
使用科学计数法,而 %g
根据数字的量级在 %f
和 %e
之间选择。精度控制有效数字。
$ ./scientific.pl Avogadro's number: 6.0221e+23 Electron mass: 9.1094e-31 kg Alternative format: 6.022e+23
可变宽度和精度
宽度和精度可以使用 *
动态指定。
dynamic.pl
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $pi = 3.141592653589793; my $width = 10; my $precision = 4; printf("Fixed: %.*f\n", $precision, $pi); printf("Dynamic width: %*.*f\n", $width, $precision, $pi);
格式字符串中的 *
表示“将下一个参数用作此值”。这允许对格式参数进行运行时控制。
$ ./dynamic.pl Fixed: 3.1416 Dynamic width: 3.1416
位置参数
参数可以在格式字符串中按位置引用。
positional.pl
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $name = "Bob"; my $age = 42; my $score = 95.5; printf("%2\$s is %1\$d years old and scored %3\$.1f%%\n", $age, $name, $score);
n$
语法指定使用哪个参数(基于 1 的索引)。这允许在格式字符串中重新排序或重用参数。
$ ./positional.pl Bob is 42 years old and scored 95.5%
最佳实践
- 验证输入:确保值与格式说明符匹配。
- 使用常量:用于常用的格式字符串。
- 考虑区域设置:数字格式因地区而异。
- 注意精度:过高的精度可能会产生误导。
- 记录复杂的格式:解释不明显的格式。
来源
本教程介绍了 Perl 的 printf
函数,并提供了实用示例,演示了其强大的格式化功能。
作者
列出 所有 Perl 教程。