Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在Perl中将数组值拆分为新的独立数组?_Arrays_Regex_Perl_Split_Push - Fatal编程技术网

Arrays 如何在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

我是学习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 = @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; };