我必须处理部件号,什么是字母数字字符串。部件号长度为14个字符,但部件结构(s.c.上层组件)数量较短。在元数据转换中,需要使用拖尾零将上层部分编号扩展为14个字符的全长。
我提出了以下解决方案
my $number = "M30SA0000002"; # same upper level part number
my $len = 14;
if (length($number) < $len) {
print "Number [$number] is smaller, length (" . length ($number) . ")\n";
$number = sprintf("%-${len}s", $number);
$number =~ tr/ /0/;
}
print "\New number [$number], length (" . length ($number) . ")\n"
这是输出
Number [M30SA0000002] is smaller, length (12)
New number [M30SA000000200], length (14)
虽然这会产生理想的结果,但这有点尴尬,以2行执行这个简单的任务。有没有办法在一行中做到这一点?遗憾的是sprintf
没有提供使用任何尾随字符扩展字符串的方法。
生产环境在Windows Server计算机上运行,Perl版本5.14.2.1
,没有CPAN模块,只有核心模块可用。
编辑: 我已经对4个解决方案进行了基准测试
use Benchmark qw(:all);
timethese(10000000, {
'While' => sub { my $number = "M30SA0000002"; $number .= '0' while 14 > length $number; },
'Repeat' => sub { my $number = "M30SA0000002"; $number .= '0' x (14 - length $number); },
'Substring' => sub { my $number = "M30SA0000002"; $number = substr($number . "0" x 14, 0, 14); },
'Sprintf' => sub { my $number = "M30SA0000002"; $number = sprintf("%-14s", $number); $number =~ tr/ /0/; },
});
结果如下:
Benchmark: timing 10000000 iterations of Repeat, Sprintf, Substring, While...
Repeat: 2 wallclock secs ( 1.65 usr + 0.00 sys = 1.65 CPU) @ 6045949.21/s (n=10000000)
Sprintf: 3 wallclock secs ( 3.90 usr + 0.00 sys = 3.90 CPU) @ 2564102.56/s (n=10000000)
Substring: 3 wallclock secs ( 2.78 usr + 0.00 sys = 2.78 CPU) @ 3602305.48/s (n=10000000)
While: 2 wallclock secs ( 2.81 usr + 0.00 sys = 2.81 CPU) @ 3561253.56/s (n=10000000)
重复解决方案似乎是最快的解决方案。
答案 0 :(得分:3)
您可以将while
修饰符与&#34;追加&#34;一起使用赋值:
$number .= '0' while 14 > length $number;
或做一些数学运算并使用重复运算符(感谢@ loldop):
$number .= '0' x (14 - length $number);
答案 1 :(得分:2)
一步解决方案是附加大量0
并切掉你不需要的那些:
$number = substr($number . "0" x 14, 0, 14);