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

时间:2010-03-21 07:58:36

标签: 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 . $prompt;

选项2:

if ( $p > 0 ) { 
    $key = $key . ' ' x $p . $prompt;
}
else {
    $key = $key . $prompt;
}

say "$key$value"

4 个答案:

答案 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 );