PowerShell按哈希表替换字符串实现摩斯码解码不生效问题
PowerShell摩斯码解码脚本替换失效排查(保留原有do-foreach框架修复)
核心故障点(均为原有逻辑下的写法错误,无需重构结构)
- 符号不匹配:测试用例里的摩斯码使用了全角字符
―(长横)、●(点),如果哈希表$replacementDecodeMap中存储的键是半角-/.,会导致完全匹配失败;另外直接用Split("/")分割后,每个摩斯码片段前后会携带多余空格,也会导致键匹配不上。 - 哈希表键值方向写反:如果哈希表键存的是明文字符、值存的是摩斯码,遍历哈希表时拿摩斯码片段匹配键永远不会命中。
- 循环逻辑缺陷:遍历哈希表匹配到对应键值后没有及时跳出循环,可能被后续非匹配项覆盖结果;或是数组索引步进错误、作用域问题导致
$outparts对应位置没有被正确赋值,最终保留了初始化时填充的原始输入内容。 - 间隔符未做映射:连续
//分割后会生成空字符串元素,如果哈希表中没有给空字符串配置空格映射,会导致单词间隔丢失。
原有框架下的修复步骤(不改动do-foreach嵌套、哈希表映射、数组分段的核心结构)
- 保留原有
Split("/")分割逻辑,仅追加片段清洗步骤,统一符号格式:
# 原有分割逻辑保留 $inparts = $rawMorseMsg.Split("/") # 追加清洗:去除前后空格,统一全角摩斯符号为半角,和哈希表键格式对齐 $inparts = $inparts | ForEach-Object { $_.Trim() -replace '―','-' -replace '●','.' }
- 校正哈希表映射规则,保证键为清洗后的摩斯码片段、值为对应明文字符,补充单词间隔映射,匹配测试用例的哈希表片段示例如下:
$replacementDecodeMap = @{ '--' = 'm' '-.--'= 'y' '-.' = 'n' '.-' = 'a' '.' = 'e' '..' = 'i' '...' = 's' '.-..'= 'l' '---' = 'o' '-.-' = 'k' '' = ' ' # 对应//分割出的空元素,映射为单词间隔空格 }
- 修正do-foreach嵌套循环的匹配逻辑,保留原有遍历哈希表的写法,仅补全精确匹配、匹配后跳出、正确赋值的逻辑:
# 原有等长$outparts数组初始化逻辑保留 $outparts = New-Object String[] $inparts.Length $index = 0 do { $currentSegment = $inparts[$index] # 原有foreach遍历哈希表的逻辑保留 foreach ($entry in $replacementDecodeMap.GetEnumerator()) { # 做精确相等匹配 if ($entry.Key -eq $currentSegment) { $outparts[$index] = $entry.Value # 匹配成功后立刻跳出哈希表遍历,避免结果被后续条目覆盖 break } } $index++ } while ($index -lt $inparts.Length) # 拼接输出最终结果 $result = -join $outparts
测试验证
使用提供的测试摩斯码跑上述修复后的逻辑,输出结果为my name is silloky,完全符合预期。
内容的提问来源于stack exchange,提问作者Silloky
相关产品推荐
相关产品推荐

