1

我在互联网上找到了这个脚本。它有点旧,开发人员页面早已不复存在。该代码有效,但我正在尝试对其进行一些清理。例如:如果周数 = 0,则不显示它。我从控制台收到有关额外令牌的错误。我试图用谷歌搜索这个错误,但没有任何可靠的东西出现。寻找一些见解。

评论部分是我“清理它”的尝试。这是我收到的错误。

Tcl 错误 [正常运行时间]:表达式“$::time(week) = 0”中的语法错误:表达式末尾的额外标记

评论该部分后,它工作正常。只是想清理一下,所以它不会返回“我已经在线 0 周 0 天 0 小时 1 分钟”。

bind pub "-|-" !uptime uptime
proc uptime { nick host handle channel text } {

putquick "PRIVMSG $channel :I have been online for [eggtime]."

}

proc eggtime {} {
  set ::time(uptime) [expr [clock seconds]-$::uptime]
  set ::time(week) [expr $::time(uptime)/604800]
  set ::time(uptime) [expr $::time(uptime)-$::time(week)*604800]
  set ::time(days) [expr $::time(uptime)/86400]
  set ::time(uptime) [expr $::time(uptime)-$::time(days)*86400]
  set ::time(hour) [expr $::time(uptime)/3600]
  set ::time(uptime) [expr $::time(uptime)-$::time(hour)*3600]
  set ::time(mins) [expr $::time(uptime)/60]
  set ::time(uptime) [expr $::time(uptime)-$::time(mins)*60]
  set ::time(secs) $::time(uptime)


#if {$::time(week) = 0} {
#  set ::time(return) "$::time(days) day\(s\), $::time(hour) hour\(s\), $::time(mins) minute\(s\) and $::time(secs) second\(s\)"
#} else if {$::time(days) = 0} {
#  set ::time(return) "$::time(hour) hour\(s\), $::time(mins) minute\(s\) and $::time(secs) second\(s\)"
#} { 
#  set ::time(return) "$::time(week) week\(s\), $::time(days) day\(s\), $::time(hour) hour\(s\), $::time(mins) minute\(s\) and $::time(secs) second\(s\)"
#}

  set ::time(return) "$::time(week) week\(s\), $::time(days) day\(s\), $::time(hour) hour\(s\), $::time(mins) minute\(s\) and $::time(secs) second\(s\)"

  return $::time(return)
}
4

1 回答 1

3

相等运算符是 ==。您在评论块的最后部分缺少一个else。您还应该使用elseif而不是else if. 这不是 C。

但是,这是我之前写的一个,它需要一个经过的时间间隔并返回一个英文字符串。它大致是您的目标。

# paste::delta --
#
#       Returns the time difference between the given and current time
#       as an english string.
#
proc ::paste::delta {time} {
    set r $time
    catch {
        set delta [expr {[clock seconds] - $time}]
        if {$delta < 60} {
            set r "$delta secs ago"
        } elseif {$delta < 3600} {
            set r "[expr {$delta / 60}] mins ago"
        } elseif {$delta < 86400} {
            set r "[expr {$delta / 3600}] hours ago"
        } else {
            set r "[expr {$delta / 86400}] days ago"
        }
    }
    return $r
}

所以你会得到像 [paste::delta 7260] 给出“2 小时前”或 310 给出“5 分钟前”的东西。

另一件事 - 对于expr语句,总是用花括号括住表达式的主体。否则解析器必须再次解析主体,并且可能会产生显着的性能成本。

于 2012-04-20T20:05:11.690 回答