用短划线(' - ')在右侧用短划线填充字符串
问题描述:
右侧用短划线填充字符串。例如将'M'
转换为'M-----'
。用短划线(' - ')在右侧用短划线填充字符串
sprintf "%-6s", "M";
给我'M '
。我试过printf "%-6-s", "M";
和printf "%--6s", "M";
,但这两者都没有工作...
这可以用sprinf
完成,如果是这样,如何?
答
单靠sprintf
无法完成。 (sprintf
将只用空格或用零垫。)
sprintf("%-6s", $s) =~ tr/ /-/r
或
substr($s.("-" x 6), 0, 6)
或
$s . ("-" x (6-length($s)))
答
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
'的sprintf( “% - 6S”, “M”)=〜TR | | - | r;' –