You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:55:19