gpt4 book ai didi

string - 在 Perl 中用尾随零扩展字符串

转载 作者:行者123 更新时间:2023-12-02 17:43:07 26 4
gpt4 key购买 nike

我必须处理部件号,什么是字母数字字符串。零件编号为 14 个字符长,但零件结构(南卡罗来纳州上层组件)编号较短。在元数据转换中,上层部件号需要扩展到 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)

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

最佳答案

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

$number .= '0' while 14 > length $number;

或者做一些数学运算并使用重复运算符(感谢@ loldop):

$number .= '0' x (14 - length $number);

关于string - 在 Perl 中用尾随零扩展字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18060085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com