您更喜欢哪个版本?
#!/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;
}
say "$key$value"
答案 0 :(得分:29)
我更喜欢
sprintf "%-7s : %s", $key, $value;
或
sprintf "%-*s : %s", $p, $key, $value;
而不是所有这些奇怪的东西。
来自sprintf
文档:
标志字符
'-'
转换后的值将在字段边界上调整。 (默认为右对齐。)转换后的值在空白处填充空白,而不是在左侧填充空格或零。如果两者都给定,则'-'
会覆盖0
。字段宽度
可选的十进制数字字符串(非零第一位数字),指定最小字段宽度。如果转换后的值的字符数少于字段宽度,则会在左侧填充空格(如果已给出左侧调整标记,则填充右侧)。可以写
'*'
或'*m$'
(对于某些十进制整数m
)而不是十进制数字字符串来指定字段宽度在下一个参数中给出,或者在第m个中给出参数,分别必须是int类型。负字段宽度被视为'-'
标志,后跟正字段宽度。在任何情况下,不存在或小的字段宽度都不会导致字段截断;如果转换结果宽于字段宽度,则字段将展开以包含转换结果。
答案 1 :(得分:8)
我不喜欢选项2,因为它引入了一个不必要的特殊情况。
我会重构提示后缀的构造:
# Possible at top of program
my $suffix = ( ' ' x $p ) . $prompt;
# Later...
$key .= $suffix ;
答案 2 :(得分:5)
叫我老派,但我会使用printf()或sprintf():
printf "%-33s%s%s\n", $key, $prompt, $value;
左边将字符串$ key称为33个空格,添加$ prompt和$ value以及换行符。如果我想动态计算第一部分的长度:
printf "%-*s%s%s\n", $len, $key, $prompt, $value;
由于它是一行而不是问题4(选项1)或6(选项2),因此它在简洁程度上得分很高。
答案 3 :(得分:1)
我看起来有点奇怪,但这有效(直到现在):
#!/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 );