gpt4 book ai didi

perl:如何从编号序列中生成紧凑的名称

转载 作者:行者123 更新时间:2023-12-05 01:00:11 26 4
gpt4 key购买 nike

[perl 5.8.8]

我有一系列名称,例如:

names='foobar1304,foobar1305,foobar1306,foobar1307'  

其中名称的区别仅在于名称中某处的连续数字字符串。任何序列中的数字串都具有相同的长度,数字串组成一个连续的数字序列,没有跳过,例如 003,004,005 .

我想要一个紧凑的表示,如:
compact_name='foobar1304-7'

(紧凑形式只是一个名字,所以它的确切形式是可以协商的。)
通常只有 <10 件事情,尽管有些集合可能跨越十年,例如
'foobaz2205-11'

在 perl 中是否有一些简洁的方法可以做到这一点?我不是一个大 perl 黑客,所以要温柔一点...

处理嵌入序列的奖励积分,例如:
names='foobar33-pqq,foobar34-pqq,foobar35-pqq'

理想的脚本会巧妙地回退到 'firstname2301-lastname9922'以防它无法识别名称中的序列。

最佳答案

我不确定我得到了你的规范,但它以某种方式工作:

#!/usr/bin/perl
use warnings;
use strict;

use Test::More;

sub compact {
my $string = shift;
my ($name, $value) = split /=/, $string;

$name =~ s/s$// or die "Cannot create compact name for $name.\n"; #/ SO hilite bug
$name = 'compact_' . $name;

$value =~ s/^'|'$//g; #/ SO hilite bug
my @values = split /,/, $value; #/ SO hilite bug
my ($prefix, $first, $suffix) = $values[0] =~ /^(.+?)([0-9]+)(.*)$/;

my $last = $first + $#values;
my $same = 0;
$same++ while substr($first, 0, $same) eq substr($last, 0, $same);
$last = substr $last, $same - 1;

for my $i ($first .. $first + $#values) {
$values[$i - $first] eq ($prefix . $i . $suffix)
or die "Invalid sequence at $values[$i-$first].\n";
}
return "$name='$prefix$first-$last$suffix'";
}


is( compact("names='foobar1304,foobar1305,foobar1306,foobar1307'"),
"compact_name='foobar1304-7'");

is( compact("names='foobaz2205,foobaz2206,foobaz2207,foobaz2208,foobaz2209,foobaz2210,foobaz2211'"),
"compact_name='foobaz2205-11'");

is( compact("names='foobar33-pqq,foobar34-pqq,foobar35-pqq'"),
"compact_name='foobar33-5-pqq'");

done_testing();

关于perl:如何从编号序列中生成紧凑的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799827/

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