Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,如何用空格填充字符串的一部分?_Perl_Printing - Fatal编程技术网

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

在Perl中,如何用空格填充字符串的一部分?,perl,printing,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 .

你喜欢哪个版本

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


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

我将重构提示符后缀的结构:

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

    # Later...

    $key .= $suffix ;
我宁愿

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

而不是所有这些奇怪的东西

sprintf
文档:

标志字符

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

字段宽度

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


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


叫我老派,但我会使用printf()或sprintf():

左边将字符串$key对齐为33个空格,添加$prompt和$value以及换行符。如果我想动态计算第一部分的长度:

printf "%-*s%s%s\n", $len, $key, $prompt, $value;

由于它是一行,而不是问题的4(选项1)或6(选项2),因此在简洁程度上得分很高。

我通常会将所有标点符号直接(无空格)放在最后一个单词之后。要输出一个表,我将使用
格式
。懂Perl的人可以修改这个问题的标题,使其更具描述性吗?因为我问了一个关于最佳实践的问题,所以我现在很难不同意您的回答-使用printf,代码看起来更好,使用my_打印输出。如果您可以为未来的搜索者添加解释sprintf指令的编辑,那就太好了。特别是因为这是最好的方法。@Hynek-Pichi-Vychodil,谢谢分享这个想法。
sprintf "%-*s : %s", $p, $key, $value;
#!/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 );
printf "%-33s%s%s\n", $key, $prompt, $value;
printf "%-*s%s%s\n", $len, $key, $prompt, $value;