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

PowerShell按哈希表替换字符串实现摩斯码解码不生效问题

PowerShell摩斯码解码脚本替换失效排查(保留原有do-foreach框架修复)

核心故障点(均为原有逻辑下的写法错误,无需重构结构)

  • 符号不匹配:测试用例里的摩斯码使用了全角字符―(长横)、●(点),如果哈希表$replacementDecodeMap中存储的键是半角-/.,会导致完全匹配失败;另外直接用Split("/")分割后,每个摩斯码片段前后会携带多余空格,也会导致键匹配不上。
  • 哈希表键值方向写反:如果哈希表键存的是明文字符、值存的是摩斯码,遍历哈希表时拿摩斯码片段匹配键永远不会命中。
  • 循环逻辑缺陷:遍历哈希表匹配到对应键值后没有及时跳出循环,可能被后续非匹配项覆盖结果;或是数组索引步进错误、作用域问题导致$outparts对应位置没有被正确赋值,最终保留了初始化时填充的原始输入内容。
  • 间隔符未做映射:连续//分割后会生成空字符串元素,如果哈希表中没有给空字符串配置空格映射,会导致单词间隔丢失。

原有框架下的修复步骤(不改动do-foreach嵌套、哈希表映射、数组分段的核心结构)

  1. 保留原有Split("/")分割逻辑,仅追加片段清洗步骤,统一符号格式:
# 原有分割逻辑保留
$inparts = $rawMorseMsg.Split("/")
# 追加清洗:去除前后空格,统一全角摩斯符号为半角,和哈希表键格式对齐
$inparts = $inparts | ForEach-Object {
    $_.Trim() -replace '―','-' -replace '●','.'
}
  1. 校正哈希表映射规则,保证键为清洗后的摩斯码片段、值为对应明文字符,补充单词间隔映射,匹配测试用例的哈希表片段示例如下:
$replacementDecodeMap = @{
    '--'  = 'm'
    '-.--'= 'y'
    '-.'  = 'n'
    '.-'  = 'a'
    '.'   = 'e'
    '..'  = 'i'
    '...' = 's'
    '.-..'= 'l'
    '---' = 'o'
    '-.-' = 'k'
    ''    = ' ' # 对应//分割出的空元素,映射为单词间隔空格
}
  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:45:29