我正在为我的公司开发一个项目,无法弄清楚如何从变量中提取值,我们称之为'a'并在文件名中使用它。
所以,如果a的值是1234那么作为一个例子,我希望文件名是1234_abc.pcm我想也许我可以使用美元符号从'a'读取值但是这不起作用我能想到的每个组合都使用了花括号和方括号以及圆括号,但却没有达到终点线。一整天都没有奏效。我最终得到$ a_abc.pcm作为文件名。任何想法/想法都会有很大的帮助!
提前致谢,
ButtahNBred
答案 0 :(得分:3)
我打赌你这样做了:
set filename "c:\0000\${a}_abc.pcm"
第二个反斜杠,您认为是目录分隔符,实际上是转义$
,阻止变量替换[*]。
选择以下其中一种方法:
set filename "c:\\0000\\${a}_abc.pcm"
set filename "c:/0000/${a}_abc.pcm"
set filename [format {c:\0000\%s_abc.pcm} $a]
set filename [file join c: 0000 ${a}_abc.pcm] ;# my preferred solution
Windows可以很好地处理正斜杠)
[*]它实际上比这更糟糕:由于\000
你实际上得到一个NUL字节。我不熟悉Tcl的字符串实现以及NUL的作用,但是:
$ tclsh <<< 'set a 1234; puts "c:\0000\${a}_foo"' | od -c
0000000 c : \0 0 $ { a } _ f o o \n
0000015
答案 1 :(得分:2)
听起来你在找这样的东西?
set a "1234"
set suffix "_abc.pcm"
set filename "${a}${suffix}"
答案 2 :(得分:0)
格伦杰克曼指出;你的问题可能是由反斜杠引起的。
要避免这些问题,您应该使用file
命令构建文件名 -
% set a 1234
1234
% set filename [file join c:/ 0000 ${a}_abc.pcm
c:/0000/1234_abc.pcm
% nativeFilename [file join nativename $filename]
c:\0000\1234_abc.pcm
如果您打算在Tcl中使用文件名 - 例如在open
语句中,您无需使用file nativename
转换为原生格式。
如果您编写的代码可以在Windows,Unix和Mac之间移植,那么使用file
命令是必不可少的。即使你不是,也有助于避免反斜杠问题。
答案 3 :(得分:0)
幸运的是,在与工作人员讨论后,我们发现使用此命令{C:\ 0000 \}设置录制目录最简单,然后附加序列号,以便存在目录和文件名。
正斜杠对我们不起作用,所以我猜我们的软件识别正斜杠作为目录和文件名分隔符存在问题。