Arrays 如何在Perl中将数组值拆分为新的独立数组?
我是学习perl的初学者。 我在这里要做的是拆分数组Arrays 如何在Perl中将数组值拆分为新的独立数组?,arrays,regex,perl,split,push,Arrays,Regex,Perl,Split,Push,我是学习perl的初学者。 我在这里要做的是拆分数组@value,并将其插入一个新数组。我的问题是,我不知道如何使我的代码在循环中运行并得到我想要的结果 是否可以使用此方法获得所需的结果,或者是否有其他替代方法/方法获得相同的结果 我的代码如下 my @separated = (); my @separated1 = (); my @separated2 = (); my @separated3 = (); my $counter = 0; my @values = "aaa 111 AAA b
@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 = @separated1\n";
print "separated2 = @separated2\n";
print "separated3 = @separated3\n";
我得到的结果
分离1=aaa
分离的2=111
分离3=AAA
期望结果
分离1=aaa bbb ccc ddd
分离2=111 222 333 444
分离3=AAA BB CCC DD
上述内容也可以写成如下:
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风格的for循环适用于每3个元素迭代一次
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];
}
它替换了两个循环
这张照片
[
["aaa", "bbb", "ccc", "ddd"],
[111, 222, 333, 444],
["AAA", "BBB", "CCC", "DDD"],
]
这将产生与上述相同的带有arrayrefs的@sep
部分
返回数组引用的列表,每个数组引用都包含索引,因为它对@值的索引列表进行了分区。然后在每个数组中,将REF计算到其索引列表中(@$
),该列表用于获取相应的@值切片;该列表用于生成带有[]
的arrayref。因此map
返回一个arrayref列表,其中的值根据需要进行分区
有关使用参考资料的信息,请参见教程和参考另一个版本,该版本使用非核心但非常有用的模块中的部分
,该模块直接划分元素:
#!/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
九月二日:111 222 333 444
sep3:AAA BBB CCC DDD
这里的神奇之处在于,它最终创建了块的局部变量,该变量在块的多个求值过程中保持其值。另一个作业:
可能会帮助您获得所需的结果:
([a-z]+\s)([0-9]+\s)([A-Z]+)
它有三个捕捉组,分别对应您想要的结果。您可以根据需要向其添加或减少边界,而且它可能比其他方法更快
图表
此图显示了表达式的工作方式,您可以通过以下方式可视化其他表达式:
JavaScript测试
const regex=/([a-z]+\s)([0-9]+\s)([a-z]+)/gm;
const str=`aaa 111 aaa bbb 222 bbb ccc 333 ccc ddd 444 ddd`;
常量subst=`\n$1和$2和$3\n`;
//被替换的值将包含在结果变量中
const result=str.replace(regex,subst);
log('替换结果:',结果)代码>我喜欢@ikegami和@zdim的解决方案@zdim对来自的part()
的使用让我想起了natatime
:
my @values = split(' ', "aaa 111 AAA bbb 222 BBB ccc 333 CCC ddd 444 DDD");
use List::MoreUtils 'natatime';
my $nata_iter = natatime 3, @values ;
my @aoa ;
while (my @tmp = $nata_iter->()) { push @aoa, \@tmp; };
这不是一个真正的考虑,但可能很有趣:通过使用一个临时数组(@tmp
)来存储迭代器的输出,原始的@值
保持不变,而更直接的拼接()
则具有破坏性 实际上,您没有使用$counter变量。您可以增加它,但从不访问它。我想你想用它作为数组的索引。这行:my@values=“aaa 111 aaa bbb 222 bbb ccc 333 ccc ddd 444 ddd”
。。。正在为数组指定一个标量值。它有效地将标量值放入@value
数组的第一个插槽中。您可以在此处直接执行拆分操作:my@values=split/,“aaa 111 aaa bbb 222 bbb ccc 333 ccc ddd 444 ddd”
一旦设置好,剩下的就是一次取3个值等等。如果原始$values
中的项数不能被3整除,那么第一个解决方案将在结果中放入未定义的值。@Silvar,这是有意的,所以最好指出AoA解决方案不这样做。
my @sep = map { [ @values[@$_] ] } part { $_%3 } 0..$#values;
#!/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";
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: @$sep1\nsep2: @$sep2\nsep3: @$sep3\n";
([a-z]+\s)([0-9]+\s)([A-Z]+)
my @values = split(' ', "aaa 111 AAA bbb 222 BBB ccc 333 CCC ddd 444 DDD");
use List::MoreUtils 'natatime';
my $nata_iter = natatime 3, @values ;
my @aoa ;
while (my @tmp = $nata_iter->()) { push @aoa, \@tmp; };