我们需要在 TCL 中“取消设置”变量吗?
Posted
技术标签:
【中文标题】我们需要在 TCL 中“取消设置”变量吗?【英文标题】:do we need to "unset" variables in TCL? 【发布时间】:2011-01-20 20:58:23 【问题描述】:这是好的TCL代码的要求吗?如果我们不在脚本中使用“unset”关键字会发生什么?我应该知道哪些不良影响?
我继承了一些遗留代码,并且由于“未设置”不存在的变量而导致的错误让我陷入困境!
【问题讨论】:
【参考方案1】:使用info exists
命令可以在使用变量之前确定它是否存在。请确保如果您不使用unset
,请确保您不会在其他地方破坏程序的逻辑。
unset
变量没有特定于 Tcl 的原因,也就是说,它不会导致内存泄漏或变量句柄用完或任何类似的疯狂。使用unset
可能是一种防御性编程实践,因为它可以防止将来使用不再相关的变量。在不了解您正在使用的确切代码的情况下,很难提供更详细的信息。
【讨论】:
没有内存泄漏或类似情况。正是我希望听到的!现在我可以在整个代码中禁止那些愚蠢的“未设置”。是的,现在看,对我来说似乎也更像是防御性编程。尽管如此,就我而言,它看起来有点“过多”的防守。 “信息存在”对我来说是新的 - 谢谢!【参考方案2】:除了其他回复,如果你的Tcl版本足够新,还可以使用:
unset -nocomplain foo
如果 foo 存在,它将取消设置,但如果不存在,则不会抱怨。
【讨论】:
“足够新”涵盖了现在在野外的每个版本【参考方案3】:取决于系统统计信息,当您的脚本将大量数据存储到变量和数组中时,它可能会出现“无法分配字节”的问题。一旦缓存或 RAM 满了说“无法分配 XXXXXXXX 字节”,它就会中断。
确保您没有将那么多数据存储到变量中,否则一旦使用结束,请取消设置各个数据集(变量)
【讨论】:
【参考方案4】:请注意,因为我似乎无法评论上面的“信息存在”;
我经常使用这种形式..
if [info exists pie] && [$pie == "ThisIsWhatIWantInPie"]
puts "I found what I wanted in pie."
else
puts "Pie did not exist; but I still did not error,TCL's evaluation \
will see the conditional failed on the [info exists] and not \
continue onto the comparison."
【讨论】:
【参考方案5】:除了其他回复之外,我想补充一点,如果您想忽略由于取消设置不存在的变量而引发的错误,请使用“catch”。
#!/bin/bash
catch unset newVariable
【讨论】:
以上是关于我们需要在 TCL 中“取消设置”变量吗?的主要内容,如果未能解决你的问题,请参考以下文章