Perl循环处理多组怪物数据:解决变量覆盖与按需输出问题
解决Perl循环覆盖变量仅输出最后一组数据的问题
核心解决思路
每次收集完一组兽人属性数据后,立即输出当前拼接好的内容,然后重置存储变量,再启动下一组数据的收集,彻底避免后续数据覆盖之前的内容。
具体代码实现示例
假设你的兽人数据以空行作为组分隔(每行格式为字段名: 值,比如Name: 血牙兽人),可以按以下方式调整脚本:
#!/usr/bin/perl use strict; use warnings; my $combatblock = ''; # 读取数据(这里以标准输入为例,可替换为open读取文件的逻辑) while (my $line = <>) { chomp $line; # 识别一组数据的结束标记(此处用空行,可根据实际格式修改) if ($line eq '') { # 输出当前组内容(仅当变量非空时输出) print $combatblock . "\n=== 兽人分隔线 ===\n" if $combatblock; # 重置变量,准备接收下一组数据 $combatblock = ''; next; } # 精准提取需要的字段 if ($line =~ /^(Name|DEX|DB|MP|HP):\s*(.+)$/) { my ($field, $value) = ($1, $2); # 按指定格式拼接内容到变量 $combatblock .= "$field: $value\n"; } } # 处理最后一组数据(避免文件末尾无分隔标记导致数据遗漏) print $combatblock if $combatblock;
关键调整说明
- 及时输出+重置:检测到组结束标记时,立刻输出当前组内容并清空存储变量,确保下一组数据从零开始积累。
- 边界处理:循环结束后检查变量是否还有内容,避免最后一组因无分隔标记被遗漏。
- 精准字段匹配:用正则锁定需要的字段,防止无关数据混入结果。
如果你的数据不是用空行分隔,只需修改组结束的判断条件即可(比如换成特定字符串CREATURE_END)。
内容的提问来源于stack exchange,提问作者Colin Brett
相关产品推荐
相关产品推荐

