2017-05-06 104 views
0

右侧用短划线填充字符串。例如将'M'转换为'M-----'用短划线(' - ')在右侧用短划线填充字符串

sprintf "%-6s", "M";给我'M '。我试过printf "%-6-s", "M";printf "%--6s", "M";,但这两者都没有工作...

这可以用sprinf完成,如果是这样,如何?

+2

'的sprintf( “% - 6S”, “M”)=〜TR | | - | r;' –

回答

2

单靠sprintf无法完成。 (sprintf将只用空格或用零垫。)

sprintf("%-6s", $s) =~ tr/ /-/r 

substr($s.("-" x 6), 0, 6) 

$s . ("-" x (6-length($s))) 
1

sprintf仅支持填充与0,所以没有。你可以用其中的一个填充,然后替换填充,但问题在于,你冒着替换原始字符串中任何填充字符的风险。例如sprintf('%-6s', ' M') =~ s/ /-/gr产生--M---

FAQ

如果需要垫比其它空白字符或零您可以 使用下列方法之一。它们全都生成带有 x运算符的填充字符串,并将其与$text结合使用。这些方法不要 truncate $text

左,与任何字符右填充,创建一个新的字符串:

my $padded = $pad_char x ($pad_len - length($text)) . $text; 
my $padded = $text . $pad_char x ($pad_len - length($text)); 

左右填充任何字符,直接修改$text

substr($text, 0, 0) = $pad_char x ($pad_len - length($text)); 
$text .= $pad_char x ($pad_len - length($text)); 

如果你经常这样做,你可以把它包装在一个子程序中。

sub pad { 
    my ($str, $padding, $length) = @_; 

    my $pad_length = $length - length $str; 
    $pad_length = 0 if $pad_length < 0; 
    $padding x= $pad_length; 
    $str.$padding; 
} 

say pad('M',  '-', 6); 
say pad('MMMMMM', '-', 6); 
say pad('12345', '-', 6); 
say pad('1234567', '-', 6); 
say pad(' ', '-', 6); 

输出:

M----- 
MMMMMM 
12345- 
1234567 
    -- 
+0

向我介绍'x'操作符的奖励点。在与perl合作的10年中,我从来没有见过这种感觉,现在我感觉自己像个新手。 – ipetrik

相关问题