perl:如何从编号序列中创建紧凑的名称

标签 perl sequence names

[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/

相关文章:

python - 在线排序并删除两个整数流上的重复项

MySQL PDO - 用变量完成请求的最佳方法是什么?

algorithm - 如何在指数时间内找到最长公共(public)子序列?

python - 打印特定文件夹中所有文件夹和子文件夹名称的程序

object - 命名软件对象的在线指南?

linux - DBI 的 Perl API 版本 v5.14.0 与/usr/lib64/perl5/DynaLoader.pm 处的 v5.16.0 不匹配

perl - chomp 是如何改变非引用传递的变量的值的?

c# - 如何检索 StructureMap 中所有命名实例的名称

regex - 使用正则表达式忽略空格(perl)

mysql - 在 perl/tk 上使用线程来避免窗口卡住/不响应