perl中的字符串分区(将复杂字符串转换为数组)

时间:2014-06-18 09:54:50

标签: string perl

有一个大字符串s,其中包含以逗号分隔的项目代码。

例如

$s="90320,328923,SKJS32767,DSIKUDIU,829EUE,AUSIUD0Q897,AJIUE98,
387493420DA,93RE,AKDJ93,SADI983,90439,JADKJ84";

在我的应用程序中,这些字符串被传递给一个函数,该函数返回这些项目的价格,函数的输出是项目代码输入的相应价格。

但是,由于某些限制,$s的最大长度不应超过16.如果$s的长度超过16,则抛出异常。因此,这些字符串应该被分区为一个数组,这样,每个数组元素的长度都小于或等于16.

例如:分区$s后,数组为:

$Arr[0]='90320,328923',#Note First 16 char is 0320,328923,SK. 
However, SK is neglected as its an incomplete(being partial) item code.
$Arr[1]='SKJS32767',
$Arr[2]='DSIKUDIU,829EUE',
$Arr[3]='AUSIUD0Q897',
$Arr[4]='AJIUE98',
$Arr[5]='387493420DA,93RE'

对于给定的$s,函数应该返回一个数组,遵循上面提到的约束。

我的方法是使用substr函数,并从更新的位置索引中提取最多16个偏移量的字符串。它能以更好的方式完成吗?

2 个答案:

答案 0 :(得分:4)

使用全局/g正则表达式匹配非常简单。

该程序演示。正则表达式模式查找尽可能多的字符,最多16个字符,后面必须跟逗号或字符串的结尾。

然而,我的第一个想法与RobEarl的注释相同 - 为什么不将字符串中的一个字段放入数组的每个元素中?是否真的需要将多个包装成一个元素,因为它有可能吗?

use strict;
use warnings;
use 5.010;

my $s = '90320,328923,SKJS32767,DSIKUDIU,829EUE,AUSIUD0Q897,AJIUE98,387493420DA,93RE,AKDJ93,SADI983,90439,JADKJ84';

my @partitions;

while ( $s =~ /\G(.{0,16})(?:,|\z)/g ) {
  push @partitions, $1;
}

say for @partitions;

<强>输出

90320,328923
SKJS32767
DSIKUDIU,829EUE
AUSIUD0Q897
AJIUE98
387493420DA,93RE
AKDJ93,SADI983
90439,JADKJ84

答案 1 :(得分:2)

您需要查看当前字符串的长度加上当前的文章编号,以确定它是否太长。

将长字符串拆分为单个文章。如果字符串低于17个字符,则连接新字符串列表的最后一个元素,或者将文章编号作为新字符串推入列表中。

my $s="90320,328923,SKJS32767,DSIKUDIU,829EUE,AUSIUD0Q897,AJIUE98,387493420DA,93RE,AKDJ93,SADI983,90439,JADKJ84";
my @items = split /,/, $s;
my @strings = ( shift @items );
while ( my $item = shift @items ) {
  if ( length($strings[-1]) + length($item) > 15) { # 15 because of the comma
    push @strings, $item;
  } else {
    $strings[-1] .= ',' . $item;
  }
}

dd \@strings;

__END__
[
  "90320,328923",
  "SKJS32767",
  "DSIKUDIU,829EUE",
  "AUSIUD0Q897",
  "AJIUE98",
  "387493420DA,93RE",
  "AKDJ93,SADI983",
  "90439,JADKJ84",
]