在Perl中,如何用空格填充字符串的一部分?

sid*_*com 12 printing perl

你更喜欢哪个版本?

#!/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类型.负字段宽度被视为'-'标志,后跟正字段宽度.在任何情况下,不存在或小的字段宽度都不会导致字段截断; 如果转换结果比字段宽度宽,则扩展该字段以包含转换结果.

  • 如果您可以添加一个编辑来为未来的搜索者解释 sprintf 指令,那就太好了。特别是因为这是最好的方法。 (2认同)

jus*_*ime 8

我不喜欢选项2,因为它引入了一个不必要的特殊情况.

我会重构提示后缀的构造:

    # Possible at top of program
    my $suffix =  ( ' ' x $p ) . $prompt;

    # Later...

    $key .= $suffix ;
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 5

叫我老派,但我会使用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),因此它在简洁程度上得分很高.