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

Perl脚本外部块print语句重复输出问题排查

问题:i3blocks天气脚本温度输出重复°C的问题

我基于一个i3blocks天气脚本改编,原脚本通过print "$values[1]"输出类似“35C”的温度格式。为了改成“35°C”的样式,我添加了这段代码:

my $deg = "°C"; my @values2 = split("C",$values[1]);

并且把最后一条print语句改成了print "$values2[0]$deg";,结果实际输出变成了“35°C°C”——就连单独用print语句或者直接写print "$values2[0]°C"都会出现重复的°C。但如果把温度嵌入到内层天气图标的print语句里,比如print "$sun$values2[0]$deg";,输出却是正常的,完全搞不懂为什么外部块的print语句会重复输出°C?


问题分析与解决思路

咱们一步一步拆解问题根源,再给你靠谱的解决办法:

1. 先搞懂split的行为坑点

当你用split("C",$values[1])处理原输出“35C”时,split会把字符串从“C”的位置切开,得到的@values2数组其实是("35", "")——因为原字符串结尾的“C”被切掉后,后面会留下一个空字符串元素。不过这本身不会直接导致重复输出,除非你的代码里有其他逻辑意外拼接了这个空元素。

2. 最可能的原因:重复执行了print逻辑

你说嵌入图标print就正常,单独print就重复,大概率是原脚本的print语句你没完全删掉!比如原脚本里本来就有print "$values[1]",你加了新的print但没注释掉原来的,这样就会先输出“35C”,你的新代码又输出“35°C”,看起来就像是“35°C°C”(其实是“35C”+“35°C”的视觉重合)。

或者你的脚本里存在分支逻辑,外部的print被执行了两次——比如某个条件判断下,代码绕了两次print流程。

3. 快速解决&调试方案

不管原因是什么,咱们可以换一种更可靠的方式处理温度格式,同时排查问题:

方案一:用字符串替换替代split(最稳妥)

不用split,直接把原字符串里的“C”替换成“°C”,一步到位:

my $temp = $values[1];
$temp =~ s/C/°C/;  # 把所有C替换成°C,这里原输出只有一个C,完全适用
print $temp;
方案二:调试变量定位问题

在print之前先打印变量的真实内容,看看$values[1]和@values2到底是什么:

# 调试用,执行完可以删掉
print "DEBUG: values[1] = '$values[1]'\n";
print "DEBUG: values2数组内容 = '@values2'\n";

通过调试信息,你能一眼看到是不是原字符串本身有问题,或者数组里藏了额外元素。

方案三:检查重复执行的代码

仔细扫一遍你的脚本:

  • 是不是没删除原脚本的print "$values[1]"语句?
  • 是不是在if/else分支里不小心写了两次print温度的逻辑?

内容的提问来源于stack exchange,提问作者Ébe Isaac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:43:26