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

gjmwrych  于 2022-12-19  发布在  Perl
关注(0)|答案(4)|浏览(181)

你喜欢哪个版本?

#!/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;

备选方案二:
一个二个一个一个

brccelvz

brccelvz1#

我宁愿

sprintf "%-7s : %s", $key, $value;

sprintf "%-*s : %s", $p, $key, $value;

而不是这些奇怪的东西。
sprintf documentation

标志字符

'-'转换后的值将在字段边界上向左调整。(默认值为右对齐。)转换后的值在右边填充空白,而不是在左边填充空白或零。如果'-'0都给定,则'-'将覆盖0

字段宽度

可选的十进制数字字符串(第一个数字不为零),指定最小字段宽度。如果转换后的值的字符数少于字段宽度,则将在其左侧填充空格(或右,如果已给出左调整标志),可以写'*''*m$'来代替十进制数字串(对于某个十进制整数m),指定分别在下一个参数或第m个参数中给出字段宽度,其类型必须为int。负字段宽度被视为'-'标志,后跟正字段宽度。在任何情况下,不存在的或小的字段宽度都不会导致字段截断;如果转换结果比字段宽度宽,则扩展字段以包含转换结果。

zsbz8rwp

zsbz8rwp2#

我不喜欢选项2,因为它引入了不必要的特殊情况。
我将重构prompt后缀的结构:

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

    # Later...

    $key .= $suffix ;
mwkjh3gx

mwkjh3gx3#

可以说我是守旧派,但我会使用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),因此在简洁程度上得分较高。

kiz8lqtg

kiz8lqtg4#

我看起来有点奇怪,但这是工作(直到现在):

#!/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 );

相关问题