Perl向子数组推送元素报错:Experimental push on scalar is now forbidden
Perl二维数组元素添加报错修复
需求说明
将@main数组中的字符串拆分后,把字母存入二维数组@arr1、数字存入二维数组@arr2,预期数组结构如下:
@arr1:( [a,b,c] [d] [e,f,g,h] [i,j] )@arr2:( [1,2,3] [4] [5,6,7,8] [9,10] )
原代码
@main = ( "a 1 b 2 c 3 ", "d 4", "e 5 f 6 g 7 h 8", "i 9 j 10", ); @arr1 = (); # 仅存储字母 # 预期结构: #( #[a,b,c] #[d] #[e,f,g,h] #[i,j] #) @arr2 = (); # 仅存储数字 # 预期结构: #( #[1,2,3] #[4] #[5,6,7,8] #[9,10] #) for($i=0;@main;$i+=1){ @line = split(/\s+/,shift(@main)); push(@arr1,[]); push(@arr2,[]); while(@line){ push(@arr1[$i],shift(@line)); push(@arr2[$i],shift(@line)); } }
报错信息
Experimental push on scalar is now forbidden at index.pl line 29, near "))" Experimental push on scalar is now forbidden at index.pl line 30, near "))"
问题原因
@arr1[$i]返回的是数组引用(属于标量类型),Perl禁止直接向标量执行push操作,因此触发该错误。
解决方法
需要对数组引用进行解引用,将其转为可操作的数组,有两种常用方式:
方式1:直接使用解引用操作符@{}
将push(@arr1[$i], ...)改为push(@{$arr1[$i]}, ...),同理处理@arr2[$i]:
while(@line){ push(@{$arr1[$i]}, shift(@line)); push(@{$arr2[$i]}, shift(@line)); }
方式2:先将引用存入变量再操作
先把数组引用赋值给临时变量,再对变量解引用:
while(@line){ my $ref1 = $arr1[$i]; my $ref2 = $arr2[$i]; push(@$ref1, shift(@line)); push(@$ref2, shift(@line)); }
修正后的完整代码
@main = ( "a 1 b 2 c 3 ", "d 4", "e 5 f 6 g 7 h 8", "i 9 j 10", ); @arr1 = (); @arr2 = (); for($i=0;@main;$i+=1){ @line = split(/\s+/,shift(@main)); push(@arr1,[]); push(@arr2,[]); while(@line){ push(@{$arr1[$i]}, shift(@line)); push(@{$arr2[$i]}, shift(@line)); } } # 可选:验证结果 use Data::Dumper; print Dumper(\@arr1); print Dumper(\@arr2);
内容的提问来源于stack exchange,提问作者gabegad123
相关产品推荐
相关产品推荐

