Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在Perl中扩展带尾随零的字符串_String_Perl_Format_Printf - Fatal编程技术网

String 在Perl中扩展带尾随零的字符串

String 在Perl中扩展带尾随零的字符串,string,perl,format,printf,String,Perl,Format,Printf,我必须处理零件号,什么是字母数字字符串。零件编号为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

我必须处理零件号,什么是字母数字字符串。零件编号为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"
虽然这会产生理想的结果,但在两行中执行这个简单的任务会有点尴尬。有什么办法可以一行完成吗?遗憾的是,
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)

重复解决方案似乎是其中最快的。

您可以将
while
修饰符与“append”赋值一起使用:

$number .= '0' while 14 > length $number;
或者做一些数学运算并使用重复运算符(谢谢):


您可以将
while
修饰符与“append”赋值一起使用:

$number .= '0' while 14 > length $number;
或者做一些数学运算并使用重复运算符(谢谢):


一步解决方案是附加大量
0
,并切掉不需要的:

$number = substr($number . "0" x 14, 0, 14);

一步解决方案是附加大量
0
,并切掉不需要的:

$number = substr($number . "0" x 14, 0, 14);

$number.='0'x(14-长度$number)
?我们的程序已经有很多循环了。关于提供的解决方案性能,您能说些什么?
$number.='0'x(14-长度$number)
?我们的程序已经有很多循环了。对于所提供的解决方案性能,您能说些什么?当您想要扩展sprintf时,您会意识到您不能。String::Formatter不是核心Perl模块。我不能使用CPAN模块,或者至少我需要证明它的使用,但我必须经过很长的批准流程。所以我肯定跳过这一步。是什么让随机代码脱离网络(堆栈溢出)可以,但没有(CPAN)在其他地方进行过千倍的测试?我无法访问生产环境,也无法在那里安装任何东西。安装由其他部门完成。我无能为力。我明白了,展开角度。您几乎总是可以复制模块代码来部署它。这比艰难地重新发明轮子更实际,因为当你想扩展sprintf时,你会意识到你做不到。String::Formatter不是一个核心Perl模块。我不能使用CPAN模块,或者至少我需要证明它的使用,但我必须经过很长的批准流程。所以我肯定跳过这一步。是什么让随机代码脱离网络(堆栈溢出)可以,但没有(CPAN)在其他地方进行过千倍的测试?我无法访问生产环境,也无法在那里安装任何东西。安装由其他部门完成。我无能为力。我明白了,展开角度。您几乎总是可以复制模块代码来部署它。这比艰难地重新发明轮子更实际。