print、printf 和 sprintf 的详细使用案例:
print - 基本输出# 简单输出
print "Hello, World!\n"; # 输出:Hello, World!
# 输出多个参数
print "Name: ", "Alice", "\n"; # 输出:Name: Alice
# 使用逗号分隔
my $name = "Bob";
my $age = 25;
print "Name: ", $name, ", Age: ", $age, "\n";
my $language = "Perl";
print "Learning $language programming\n"; # 变量插值
print 'Learning $language programming\n'; # 单引号不插值
# 输出到文件
open my $fh, '>', 'output.txt' or die $!;
print $fh "This goes to file\n";
close $fh;
# 标准错误输出
print STDERR "Error message\n";
printf - 格式化输出my $num = 123.456789;
# 整数
printf "Integer: %d\n", 100; # 输出:Integer: 100
# 浮点数
printf "Float: %f\n", $num; # 输出:Float: 123.456789
printf "Float: %.2f\n", $num; # 输出:Float: 123.46
printf "Float: %8.2f\n", $num; # 输出:Float: 123.46
# 字符串
printf "String: %s\n", "Hello"; # 输出:String: Hello
printf "String: %10s\n", "Hello"; # 输出:String: Hello
printf "String: %-10s\n", "Hello"; # 输出:String: Hello
| 说明符 | 描述 | 示例 |
|---|---|---|
| %d | 十进制整数 | printf "%d", 100 |
| %u | 无符号整数 | printf "%u", 100 |
| %o | 八进制整数 | printf "%o", 64 |
| %x | 十六进制小写 | printf "%x", 255 |
| %X | 十六进制大写 | printf "%X", 255 |
| %f | 浮点数 | printf "%f", 3.14 |
| %e | 科学计数法小写 | printf "%e", 1000 |
| %E | 科学计数法大写 | printf "%E", 1000 |
| %g | 自动选择 %f 或 %e | printf "%g", 1000000 |
| %s | 字符串 | printf "%s", "text" |
| %c | 字符 | printf "%c", 65 (A) |
| %% | 百分号本身 | printf "%d%%", 50 |
# 格式化表格数据
my @names = ("Alice", "Bob", "Charlie");
my @scores = (95.5, 87.3, 91.8);
my @ids = (1001, 1002, 1003);
print "ID Name Score\n";
print "-----------------------\n";
for my $i (0..$#names) {
printf "%04d %-10s %5.1f\n", $ids[$i], $names[$i], $scores[$i];
}
# 输出:
# ID Name Score
# -----------------------
# 1001 Alice 95.5
# 1002 Bob 87.3
# 1003 Charlie 91.8
# 十六进制转储示例
my $data = "Perl";
printf "Hex dump: %v02X\n", $data; # 输出:Hex dump: 50.65.72.6C
sprintf - 格式化字符串(不输出)# 格式化字符串并存储
my $formatted = sprintf("Name: %s, Age: %d", "Alice", 25);
print $formatted, "\n"; # 输出:Name: Alice, Age: 25
# 格式化数字
my $price = sprintf("Price: $%.2f", 19.99);
print $price, "\n"; # 输出:Price: $19.99
# 填充和宽度
my $padded = sprintf("%04d", 42);
print $padded, "\n"; # 输出:0042
my $aligned = sprintf("%-15s: %5.2f", "Total", 123.456);
print $aligned, "\n"; # 输出:Total : 123.46
# 生成固定格式的字符串
sub format_phone {
my ($number) = @_;
return sprintf("(%03d) %03d-%04d",
substr($number, 0, 3),
substr($number, 3, 3),
substr($number, 6, 4));
}
print format_phone("1234567890"), "\n"; # 输出:(123) 456-7890
# 格式化时间
sub format_time {
my ($h, $m, $s) = @_;
return sprintf("%02d:%02d:%02d", $h, $m, $s);
}
print format_time(9, 5, 7), "\n"; # 输出:09:05:07
# 进度条生成
sub progress_bar {
my ($percent, $width) = @_;
my $bars = int($percent * $width / 100);
return sprintf("[%-${width}s] %3d%%", '#' x $bars, $percent);
}
print progress_bar(75, 20), "\n"; # 输出:[############### ] 75%
# 三种方式的对比
my $name = "Alice";
my $score = 95.5;
my $id = 1001;
# 1. print - 简单拼接
print "ID: " . $id . ", Name: " . $name . ", Score: " . $score . "\n";
# 2. printf - 直接格式化输出
printf "ID: %04d, Name: %-10s, Score: %5.1f\n", $id, $name, $score;
# 3. sprintf + print - 先格式化再输出
my $output = sprintf("ID: %04d, Name: %-10s, Score: %5.1f", $id, $name, $score);
print $output, "\n";
# 创建格式化模板
my $template = "%-10s: \$%8.2f\n";
printf $template, "Apple", 5.99;
printf $template, "Banana", 2.49;
printf $template, "Orange", 3.79;
# 输出:
# Apple : $ 5.99
# Banana : $ 2.49
# Orange : $ 3.79
sub format_currency {
my ($amount, $locale) = @_;
if ($locale eq 'US') {
return sprintf("\$%.2f", $amount);
} elsif ($locale eq 'EU') {
return sprintf("%.2f €", $amount);
} elsif ($locale eq 'JP') {
return sprintf("¥%d", $amount);
}
}
print format_currency(1234.56, 'US'), "\n"; # $1234.56
print format_currency(1234.56, 'EU'), "\n"; # 1234.56 €
# 使用逗号分隔千位
sub format_number {
my ($num) = @_;
$num = reverse $num;
$num =~ s/(\d{3})(?=\d)/$1,/g;
return reverse $num;
}
printf "Formatted: %s\n", format_number("1234567890");
# 输出:Formatted: 1,234,567,890
print: 简单输出,适合快速调试和基本输出printf: 需要精确控制输出格式时使用,特别是数字和表格数据sprintf: 需要格式化字符串但不立即输出时使用,适合生成报告或格式文本选择建议:
printprintfsprintf