2017-05-06 134 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

相關問題