1

このスクリプトはインターネットで見つけました。少し古いので、開発者ページはもうありません。コードは機能しますが、少しクリーンアップしようとしています。例: 週 = 0 の場合、表示しないでください。余分なトークンに関するエラーがコンソールから表示されます。このエラーをグーグルで検索しようとしましたが、確実なものは何も表示されません。いくつかの洞察を探しています。

コメントされたセクションは、「クリーンアップ」する私の試みです。これが私が受け取っているエラーです。

Tcl エラー [uptime]: 式「$::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コメント ブロックの最後のセクションにがありません。elseifand notも使用する必要があります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 分前」のようになります。

もう1つ-exprステートメントでは、式の本体を常に中括弧で囲みます。そうしないと、パーサーはボディを再度解析する必要があり、パフォーマンスが大幅に低下する可能性があります。

于 2012-04-20T20:05:11.690 に答える