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