我正在为我的公司开发一个项目,但不知道如何从变量中提取值,让我们称之为“a”并在文件名中使用它。
所以,如果 a 的值是 1234,那么作为一个例子,我希望文件名是 1234_abc.pcm 我想也许我可以使用美元符号从 'a' 中读取值,但这不起作用,每个组合我可以想到使用大括号和方括号以及括号都没有达到终点。一整天都没有用。我最终得到 $a_abc.pcm 作为文件名。任何想法/想法都会有很大帮助!
提前致谢,
ButtahNRed
我打赌你正在这样做:
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
听起来你正在寻找这样的东西?
set a "1234"
set suffix "_abc.pcm"
set filename "${a}${suffix}"
正如格伦杰克曼指出的那样;您的问题可能是由反斜杠引起的。
为避免这些问题,您应该使用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
.
file
如果您正在编写可在 Windows、Unix 和 Mac 之间移植的代码,则使用该命令是必不可少的。即使您不是,它也将有助于避免反斜杠问题。
幸运的是,在与工作人员讨论后,我们发现使用此命令 {C:\0000\ } 设置录制目录最简单,然后附加序列号,以便目录和文件名存在。
正斜杠对我们不起作用,所以我想我们的软件将正斜杠识别为目录和文件名分隔符存在问题。