在Perl中,如何用空格填充字符串的一部分?
你喜欢哪个版本在Perl中,如何用空格填充字符串的一部分?,perl,printing,Perl,Printing,你喜欢哪个版本 #!/usr/bin/env perl use warnings; use strict; use 5.010; my $p = 7; # 33 my $prompt = ' : '; my $key = 'very important text'; my $value = 'Hello, World!'; my $length = length $key . $prompt; $p -= $length; 备选案文1: $key = $key . ' ' x $p .
#!/usr/bin/env perl
use warnings;
use strict;
use 5.010;
my $p = 7; # 33
my $prompt = ' : ';
my $key = 'very important text';
my $value = 'Hello, World!';
my $length = length $key . $prompt;
$p -= $length;
备选案文1:
$key = $key . ' ' x $p . $prompt;
备选案文2:
if ( $p > 0 ) {
$key = $key . ' ' x $p . $prompt;
}
else {
$key = $key . $prompt;
}
我不喜欢选项2,因为它引入了一个不必要的特殊情况 我将重构提示符后缀的结构:
# Possible at top of program
my $suffix = ( ' ' x $p ) . $prompt;
# Later...
$key .= $suffix ;
我宁愿
sprintf "%-7s : %s", $key, $value;
或
而不是所有这些奇怪的东西
从sprintf
文档:
标志字符
'-'
转换后的值将在字段边界上进行左调整。(默认为右对齐。)转换后的值在右侧用空格填充,而不是在左侧用空格或零填充。如果两者都给定,则'-'
将覆盖0
字段宽度
指定最小字段宽度的可选十进制数字字符串(第一位数字不为零)。如果转换后的值的字符数少于字段宽度,则将在左侧(或右侧,如果已给出左侧调整标志)填充空格。可以编写'*'
或'*m$'
(对于某些十进制整数m
)来代替十进制数字字符串,以指定字段宽度分别在下一个参数或第m个参数中给定,必须为int类型。负字段宽度被视为'-'
标志,后跟正字段宽度。在任何情况下,不存在或较小的场宽度都不会导致场的截断;如果转换结果大于字段宽度,则字段将展开以包含转换结果
我看起来有点奇怪,但这是有效的(直到现在):
叫我老派,但我会使用printf()或sprintf(): 左边将字符串$key对齐为33个空格,添加$prompt和$value以及换行符。如果我想动态计算第一部分的长度:
printf "%-*s%s%s\n", $len, $key, $prompt, $value;
由于它是一行,而不是问题的4(选项1)或6(选项2),因此在简洁程度上得分很高。我通常会将所有标点符号直接(无空格)放在最后一个单词之后。要输出一个表,我将使用
格式
。懂Perl的人可以修改这个问题的标题,使其更具描述性吗?因为我问了一个关于最佳实践的问题,所以我现在很难不同意您的回答-使用printf,代码看起来更好,使用my_打印输出。如果您可以为未来的搜索者添加解释sprintf指令的编辑,那就太好了。特别是因为这是最好的方法。@Hynek-Pichi-Vychodil,谢谢分享这个想法。
sprintf "%-*s : %s", $p, $key, $value;
#!/usr/bin/env perl
use warnings; use strict;
use 5.010;
use utf8;
use Term::Size;
my $columns = ( Term::Size::chars *STDOUT{IO} )[0];
binmode STDOUT, ':encoding(UTF-8)';
use Text::Wrap;
use Term::ANSIColor;
sub my_print {
my( $key, $value, $prompt, $color, $p ) = @_;
my $length = length $key.$prompt;
$p -= $length;
my $suff = ( ' ' x $p ) . $prompt;
$key .= $suff;
$length = length $key;
my $col = $columns - $length;
$Text::Wrap::columns = $col;
my @array = split /\n/, wrap ( '','', $value ) ;
$array[0] = colored( $key, $color ) . $array[0];
for my $idx ( 1..$#array ) {
$array[$idx] = ( ' ' x $length ) . $array[$idx];
}
say for @array;
}
my $prompt = ' : ';
my $color = 'magenta';
my $p = 30;
my $key = 'very important text';
my $value = 'text ' x 40;
my_print( $key, $value, $prompt, $color, $p );
printf "%-33s%s%s\n", $key, $prompt, $value;
printf "%-*s%s%s\n", $len, $key, $prompt, $value;