在 ANT 脚本中,我们访问属性文件如下
<property file="input.properties"/>
在 perl 脚本中,我们访问属性文件如下
do "config.cfg";
同样的方式我如何访问 TCL 脚本中的属性文件。任何人都可以帮我吗?提前致谢...
在 ANT 脚本中,我们访问属性文件如下
<property file="input.properties"/>
在 perl 脚本中,我们访问属性文件如下
do "config.cfg";
同样的方式我如何访问 TCL 脚本中的属性文件。任何人都可以帮我吗?提前致谢...
好的,如果你希望它像在 Perl 中一样愚蠢,只需source
Tcl 中的文件。
配置文件示例(名为config.tcl
):
# Set "foo" variable:
set foo bar
要加载此配置文件:
source config.tcl
-ing之后source
,您可以在脚本中访问您的变量foo
。
与 perl 一样,恶意用户可能会输入类似
exec rm -rf ~
在您的“配置文件”中,祝您好运。
最简单的机制是使其成为脚本或使其成为数组的内容。以下是如何在仍然支持评论的同时执行后者:
proc loadProperties {arrayName fileName} {
# Put array in context
upvar 1 $arrayName ary
# Load the file contents
set f [open $fileName]
set data [read $f]
close $f
# Magic RE substitution to remove comment lines
regsub -all -line {^\s*#.*$} $data {} data
# Flesh out the array from the (now clean) file contents
array set ary $data
}
然后你会像这样使用它:
loadProperties myProps ~/myapp.props
if {[info exists myProps(debug)] && $myProps(debug)} {
parray myProps
}
在您的主目录中使用一个文件(称为myapp.props
),如下所示:
# Turn on debug mode
debug true
# Set the foos and the bars
foo "abc"
bar "Harry's place downtown"
您可以做比这更复杂的事情,但它为您提供了一种易于使用的格式。
如果您更喜欢使用可执行配置,只需执行以下操作:
# Define an abstraction that we want users to use
proc setProperty {key value} {
# Store in a global associative array, but could be anything you want
set ::props($key) $value
}
source ~/myapp_config.tcl
如果您想将操作限制为不会造成(太多)麻烦的操作,您需要一种稍微复杂的方法:
interp create -safe parser
proc SetProp {key value} {
set ::props($key) $value
}
# Make a callback in the safe context to our main context property setter
interp alias parser setProperty {} SetProp
# Do the loading of the file. Note that this can't be invoked directly from
# within the safe context.
interp invokehidden parser source [file normalize ~/myapp_config.tcl]
# Get rid of the safe context; it's now surplus to requirements and contaminated
interp delete parser
安全的开销非常低。
相当于perls
$var = "test";
在 Tcl 中
set var "test"
因此,如果您希望它像在 Perl 中一样简单,我建议您使用 kostix answer。
但您也可以尝试使用dicts作为配置文件:
这看起来像
var {hello world}
other_var {Some data}
foo {bar baz}
我个人喜欢使用它,它甚至允许嵌套:
nestedvar {
subvar {value1}
subvar2 {value2}
}
和评论:有点破解,其实有关键#
# {This is a comment}
解析:
set fd [open config.file]
set config [read $fd]
close $fd
dict unset config #; # Remove comments.
使用权:
puts [dict get $config var]
puts [dict get $config nestedvar subvar]
但是如果你真的想要类似的东西$var = "foo";
(这是有效的 Perl 代码,但不是 Tcl),那么你必须自己解析这个文件。
一个例子:
proc parseConfig {file} {
set fd [open $file]
while {[gets $fd line] != -1} {
if {[regexp {^\s*\$([^\s\=]+)\s*\=\s*(.*);?$} $line -> var value]} {
# The expr parses funny stuff like 1 + 2, \001 inside strings etc.
# But this is NOT perl, so "foo" . "bar" will fail.
set ::$var [expr $value]
}
}
}
缺点:不允许多行设置,如果存在无效值将抛出错误,并允许命令注入(但您的 Perl 解决方案也这样做)。