北海市文章资讯

perl之print,printf,sprintf使用案例详解

2026-03-31 17:37:04 浏览次数:2
详细信息

printprintfsprintf 的详细使用案例:

1. 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";

2. 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

3. 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%

4. 综合比较与选择

# 三种方式的对比
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";

5. 实用技巧

格式重用

# 创建格式化模板
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

总结

选择建议:

相关推荐