2017-05-06 6 views
0

右側の文字列をダッシュ​​( ' - ')で埋める必要があります。例えば'M''M-----'に変換してください。sprintf右側にダッシュ付きの文字列

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でパディングをサポートし、そうありません。そのうちの1つをパディングしてパディングを置き換えることはできますが、その問題は、元の文字列のパディング文字を置き換える危険があることです。例えば、sprintf('%-6s', ' M') =~ s/ /-/gr--M---を生成します。 FAQから

空白以外の文字でパッドに必要とするか、またはあなたが 次のいずれかの方法を使用することができますゼロの場合。それらはすべて、 のx演算子を含むパッド文字列を生成し、それを$textと組み合わせます。これらのメソッドは、 を切り捨てて$textを切り捨てません。

左と任意の文字と、右パディング、新しい文字列の作成:あなたは、多くの場合、それを行う場合

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

:、任意の文字と

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

左と右のパディングを直接$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年間働いたことがなかったので、今はnewbのように感じます。 – ipetrik

関連する問題