Perl脚本终端实时表格生成:多行输出转等宽列格式需求
解决Perl脚本终端输出等宽列的问题
嘿,我来帮你搞定这个Perl脚本格式化输出的需求!你现在的输出是一串连续的用户信息,想要把它们拆分成整齐的等宽列展示对吧?下面是具体的实现方案:
核心思路
首先我们需要把连续的字符串拆分成单个用户的记录,然后计算每个字段(姓名、姓氏、年龄)所需的最大宽度,最后用格式化输出的方式让每一列保持等宽对齐。
完整代码示例
#!/usr/bin/perl use strict; use warnings; # 替换成你实际的终端输入数据,或者改成从STDIN读取 my $raw_data = "Name: Paul Surname: Doe Age:34 Name: Paulo Surname: Doeson Age:28 Name: Paulinho Surname: Docsone Age:5 Name: Paulmen Surname: Doee Age:12 Name: Paulchen Surname: Dooe Age:31"; # 1. 拆分数据为用户记录数组 my @users; # 用正则匹配每个用户的Name/Surname/Age组合 while ($raw_data =~ /Name: (\S+) Surname: (\S+) Age:(\d+)/g) { push @users, { name => $1, surname => $2, age => $3, }; } # 2. 计算每个字段的最大宽度(包含字段名的长度,确保列对齐) my $max_name_len = length("Name: ") + (sort { length($b) <=> length($a) } map { $_->{name} } @users)[0]; my $max_surname_len = length("Surname: ") + (sort { length($b) <=> length($a) } map { $_->{surname} } @users)[0]; my $max_age_len = length("Age: ") + (sort { length($b) <=> length($a) } map { $_->{age} } @users)[0]; # 3. 定义格式化模板,左对齐保证列整齐 my $format = "%-${max_name_len}s %-${max_surname_len}s %-${max_age_len}s\n"; # 可选:输出表头和分隔线,让表格更清晰 printf $format, "Name:", "Surname:", "Age:"; printf "%s %s %s\n", '-' x $max_name_len, '-' x $max_surname_len, '-' x $max_age_len; # 4. 逐行输出每个用户的信息 foreach my $user (@users) { printf $format, "Name: $user->{name}", "Surname: $user->{surname}", "Age: $user->{age}"; }
代码说明
- 数据拆分:使用正则表达式
/Name: (\S+) Surname: (\S+) Age:(\d+)/g循环捕获每个用户的三个字段,把它们存进哈希表数组里,方便后续处理。 - 宽度计算:通过排序找出每个字段值的最长长度,加上字段名本身的长度(比如
Name:是6个字符),得到每列需要的最大宽度。 - 格式化输出:用
sprintf的%-Ns语法实现左对齐,确保每列的内容都占据相同宽度,不管内容长短都能整齐排列。
适配终端输入的修改
如果你的数据是从终端逐行读取(比如用户输入或者管道传输),可以把数据读取部分改成这样:
# 从标准输入读取数据 my @users; while (my $line = <STDIN>) { chomp $line; # 同样用正则捕获每行里的用户信息 while ($line =~ /Name: (\S+) Surname: (\S+) Age:(\d+)/g) { push @users, { name => $1, surname => $2, age => $3 }; } }
这样运行脚本后,终端输出就会变成整齐的等宽列啦!
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

