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

Perl循环外打印数组仅输出最后元素问题求助

问题分析与解决建议

首先得揪出问题的根因:你在foreach循环里每次都用$var = join "", @array;给$var赋值——这相当于每轮循环都会把之前$var里的内容完全覆盖,只保留当前循环的数组拼接结果。而循环内的print @array是每一轮都输出当前的数组元素,多次输出连起来看起来像是完整的结果,但循环结束后$var自然只剩最后一轮的内容了。

解决方法

把$var的赋值改成追加模式,而不是直接覆盖。具体操作如下:

  1. 初始化$var时设为空字符串:my $var = '';
  2. 循环里用.=运算符把每次的拼接结果追加到$var后面:$var .= join "", @array;

修改后的完整代码

my $var = ''; # 初始化为空字符串,准备累加结果
foreach (@rows) {
    (my $dump = $_->{WA}) =~ s/\s+$//;
    ($shortdump->{MANDT},$shortdump->{CCCATEGORY},$shortdump->{CCCORACTIV},$shortdump->{CCNOCLIIND}) = map { s/^\s+//; s/\s+$//; $_ } split(";", $dump);
    my @array = split('', $shortdump->{MANDT}, length($shortdump->{MANDT}));
    $var .= join "", @array; # 用.=追加内容,而非=覆盖原有值
    print @array; # 这里依然正常输出每轮的数组元素
}
print "Array: $var"; # 现在会输出所有循环的拼接结果了

额外简化建议

其实你这里的split('', $shortdump->{MANDT}, length($shortdump->{MANDT}))有点冗余,split('', $str)本身就会把字符串拆成单个字符的数组,第三个参数在这里起不到额外作用,可以简化成my @array = split('', $shortdump->{MANDT});。如果只是要把$shortdump->{MANDT}直接拼到$var里,甚至连数组都不用,直接写$var .= $shortdump->{MANDT};就行,代码会更简洁。

内容的提问来源于stack exchange,提问作者spammik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:32:30