当字符串从alpha更改为numeric时插入连字符

时间:2014-07-16 16:46:19

标签: performance perl

给定1到10个字符长的随机字母数字字符串(A-Z0-9),我想在从alpha变为数字或从数字变为alpha时插入连字符。

我现在有一些可行的东西,但我确信它看起来很糟糕。我知道有一个更好的方法可以解决这个问题,但办公室的某个人今天早上做的咖啡很少,或者至少这是我要去的借口。 ;)

我必须这样做〜1500万次,所以越快越好。

代码片段:

my @letters = split //, $string;
my $type;
foreach my $letter ( @letters ) {
  if (! $type) {
    if ($letter =~ /^[A-Z]$/) {
      $type = 'a'
    }
    else {
      $type = 'd'
    }
    $string = $letter;
    next;
  }
  else {
    if ($type eq 'a') {
      if ($letter =~ /^[0-9]$/) {
        $string .= '-' . $letter;
        $type = 'd';
        next;
      }
      else {
        $sring .= $letter;
      }
    }
    else {
      if ($letter =~ /^[A-Z]$/) {
etc, etc.

呃,只是看着它就疼。

1 个答案:

答案 0 :(得分:2)

这应该有效:

$string =~ s/([A-Z])([0-9])/$1-$2/g;
$string =~ s/([0-9])([A-Z])/$1-$2/g;

如果您想要不区分大小写,请添加/i修饰符。


可能更快(因为它避免了捕获),但需要5.10:

$string =~ s/[A-Z]\K(?=[0-9])/-/g;
$string =~ s/[0-9]\K(?=[A-Z])/-/g;