我需要将此字符串拆分为数组:
$string = "9583526578','9583636523','9673522574','9183556528','9983023378";
以下是分割后我希望我的数组看起来的样子:
@foo = [
[9583526578, 9583636523],
[9673522574, 9183556528],
[9983023378]
]
您可能已经注意到,我需要将此字符串拆分为 n 组(在此示例中为2),但如果与 n
如何在Perl中完成?
我已完成了我的研究和实验,但似乎无法在几个小时后完成任务。
感谢您的时间! :)
答案 0 :(得分:4)
如果你可以相信它们都是整数,那么提取很容易。抓住所有整数。
my @numbers = $string =~ /(\d+)/g;
然后将它们分成两部分......
push @matrix, [splice @numbers, 0, 2] while @numbers;
不像现有的那样具有内存效率,而是简单的代码(如果你搞定列表处理)。
如果将它们分成对的唯一原因是成对处理它们,你可以破坏性地遍历数组......
while( my @pair = splice @numbers, 0, 2 ) {
...
}
或者你可以在Perl中以3个部分for循环的罕见有效用途之一成对迭代。
for(
my $idx = 0;
my @pair = @numbers[$idx, $idx+1];
$idx += 2;
)
{
...
}
最后,你可以使用perl5i。
use perl5i::2;
@numbers->foreach( func($first, $second) { ... } );
您还可以使用List::MoreUtils natatime
。
答案 1 :(得分:0)
首先拆分“','”以给你一个数组,然后根据需要对元素进行分组。
答案 2 :(得分:0)
我建议使用正则表达式使用'([0-9] +)'检索数字,然后手动构建@foo。或者正如@MRAB建议的那样,拆分更加直截了当。你为什么瞄准正则表达式?
答案 3 :(得分:0)
大量不同的方式。这是一个:
$foo[0] = []; # assuming you really meant an array of arrays of arrays as you showed
while ($string =~ m/([0-9]++)[^0-9]*+([0-9]++)?/g) {
push @{ $foo[0] }, [ $1, $2 // () ];
}
(你真的是指一个数组只包含一个对arrayrefs数组的引用吗?)
答案 4 :(得分:0)
这应该与您期望的行为非常接近:
my @foo;
push @foo, [ $1, $2 // () ] while $string =~ / (\d+) (?: \D+ (\d+) ) ? /gx;