有一个大字符串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个偏移量的字符串。它能以更好的方式完成吗?
答案 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",
]