Perl循环外打印数组仅输出最后元素问题求助
问题分析与解决建议
首先得揪出问题的根因:你在foreach循环里每次都用$var = join "", @array;给$var赋值——这相当于每轮循环都会把之前$var里的内容完全覆盖,只保留当前循环的数组拼接结果。而循环内的print @array是每一轮都输出当前的数组元素,多次输出连起来看起来像是完整的结果,但循环结束后$var自然只剩最后一轮的内容了。
解决方法
把$var的赋值改成追加模式,而不是直接覆盖。具体操作如下:
- 初始化
$var时设为空字符串:my $var = ''; - 循环里用
.=运算符把每次的拼接结果追加到$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
相关产品推荐
相关产品推荐

