我们需要在 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 中“取消设置”变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP函数中使用的变量会在函数执行后自动取消设置吗?

你需要取消设置PHP内存问题吗?

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

在 makefile 上取消设置环境变量

取消设置单个命令的环境变量

TCL数据类型