arrays - regex - 在Perl中,如何将数组值拆分为新的单独数组?

我是学习perl的初学者,我尝试将数组@value分割,并且插入到一个新数组中,我的问题是,我不知道如何让我的编码在循环中运行,得到我想要的结果。

是否可以使用此方法获得所需的结果,或者是否还有其他可用的/方法来获得相同的结果?

我的代码如下所示:


my @separated = ();


my @separated1 = ();


my @separated2 = ();


my @separated3 = ();


my $counter = 0;


my @values = "aaa 111 AAA bbb 222 BBB ccc 333 CCC ddd 444 DDD";



foreach (@values) {


my @separated = split(' ', $_);


push @separated1, $separated[0];


push @separated2, $separated[1];


push @separated3, $separated[2];


}


$counter++



print "separated1 = @separated1n";


print "separated2 = @separated2n";


print "separated3 = @separated3n";



我得到的结果

separated1 =aaa

separated2 =111

separated3 =AAA

所需结果

separated1 =aaa bbb ccc ddd

separated2 =111 222 333 444

separated3 =AAA BB DD

时间:


my ( @foos, @bars, @quxs );


my @values = split(' ', $input);


while (@values) {


 push @foos, shift(@values);


 push @bars, shift(@values);


 push @quxs, shift(@values);


}



上面的内容也可以写如下:


my ( @foos, @bars, @quxs );


for ( my @values = split(' ', $input); @values; ) {


 push @foos, shift(@values);


 push @bars, shift(@values);


 push @quxs, shift(@values);


}



你确定你想要并行阵列吗?虽然它们可以节省内存,但是,通常很难使用它们,而且更容易出错,

你可以使用一个AoA :


my @moos;


my @values = split(' ', $input);


while (@values) {


 push @moos, [ splice(@values, 0, 3) ];


}



你可以使用AoH :


my @moos;


my @values = split(' ', $input);


while (@values) {


 my %moo; @moo{qw( foo bar qux )} = splice(@values, 0, 3);


 push @moos, %moo;


}



适用于循环的c样式的稀有场合,用于循环访问每个第三个元素,


my $string = 'aaa 111 AAA bbb 222 BBB ccc 333 CCC ddd 444 DDD';



my (@sep1, @sep2, @sep3);



my @values = split ' ', $string;



for (my $i=0; $i <= $#values; $i += 3) {


 push @sep1, $values[$i];


 push @sep2, $values[$i+1];


 push @sep3, $values[$i+2];


}



这假定数组确实具有所有三元组,或者更好地检查每个元素。

但是,与一组并行数组相比,使用单个结构通常要好得多。 例如,使用带有数组引用的元素的数组


use Data::Dump qw(dd);



my @sep;



for (my $i=0; $i <= $#values; $i += 3) { 


 for my $j (0..2) { 


 push @{$sep[$j]}, $values[$i+$j]; 


 }


}



dd @sep;



可以使用更清晰的方法来避免双重迭代


for my $i (0..$#values) { 


 push @{$sep[$i%3]}, $values[$i] 


}



替换两个循环。

这指纹

[
 ["aaa", "bbb", "ccc", "ddd"],
 [111, 222, 333, 444],
 ["AAA", "BBB", "CCC", "DDD"],
]

我使用Data::Dump来查看复杂数据,核心的一个替代是Data::Dumper 。

然后有许多模块使用各种类型的实用程序来处理列表。

例如,使用List::MoreUtils中的部件来划分@values数组


my @sep = map { [ @values[@$_] ] } part { $_%3 } 0..$#values;



这就产生了与arrayrefs相同的@sep

part返回一个arrayrefs列表,其中包含索引,因为它划分了@values的索引列表,在map中,每个arrayref都被评估为它的指数(@$_ )列表,用于对应的@values的相应片段; 这个列表是用[]制作一个arrayref ,因此map返回一个arrayrefs列表,并根据需要对值进行分区。

从非核心,但是,非常有用的List::MoreUtils模块中使用part的另一个版本,直接分区元素:


#!/usr/bin/perl


use warnings;


use strict;


use feature qw/say state/;


use List::MoreUtils qw/part/;



my $str = "aaa 111 AAA bbb 222 BBB ccc 333 CCC ddd 444 DDD";



my ($sep1, $sep2, $sep3) = part { state $i = 0; $i++ % 3 } split(' ', $str);



say "sep1: @$sep1";


say "sep2: @$sep2";


say "sep3: @$sep3";



打印出来


sep1: aaa bbb ccc ddd


sep2: 111 222 333 444


sep3: AAA BBB CCC DDD



List::UtilsBy的另一个任务:


use strict;


use warnings;


use List::UtilsBy 'bundle_by', 'unzip_by';



my $string = 'aaa 111 AAA bbb 222 BBB ccc 333 CCC ddd 444 DDD';


my @vals = split ' ', $string;


my ($sep1, $sep2, $sep3) = unzip_by { @$_ } bundle_by { [@_] } 3, @vals;



print "sep1: @$sep1nsep2: @$sep2nsep3: @$sep3n";



...