从Subversion HTTP URL,我想删除一些额外的文件/文件夹级别,以便在Tcl脚本中获取分支根URL。
E.g:
http://svn.example.com/repos/trunk/file.tcl
- >
http://svn.example.com/repos/trunk/
我尝试使用file dirname
命令,但我遇到了一些"意外行为" (至少从我的角度来看):
file dirname {http://svn.example.com/repos/trunk/file.tcl}
返回(来自Altera Quartus发行版的Windows 7,Tcl 8.5):
http:svn.example.com/repos/trunk
' //
' URL前缀的斜杠已被删除!?!
在其他Tcl版本(Windows 7,来自Cygwin / Linux的Tcl 8.5,Tcl 8.5)中,我得到了一个不同但仍然不正确的结果:
http:/svn.example.com/repos/trunk
(已删除了两个' /
'中的一个' //
'
为什么会有这样的结果?
还有其他选择吗?(除了使用string last
的自定义功能,string range
...)
注意: file separator
命令会根据版本返回不同的结果:
\
"在Altera Quartus的Windows " native" Tcl中; /
"在Tcl Cygwin / Linux发行版中。答案 0 :(得分:1)
file
命令用于处理文件和文件名,而不是URL。这意味着它可以为文件名执行正确的多余/
字符,但对于URL执行错误的,这完全是故意的。< / p>
uri package in Tcllib是您真正想要的,因为它允许您从URL中提取路径( 类似于文件名),以便您可以操作它:
package require uri
set uri http://svn.example.com/repos/trunk/file.tcl
# Split a URL up into its components
set uricomponents [uri::split $uri]
# ==> fragment {} port {} path repos/trunk/file.tcl scheme http host svn.example.com query {} pwd {} user {}
# Manipulate the dictionary, in this case to adjust the path part
dict with uricomponents {
set path [file dirname $path]
}
# Compose back into a normal URL
set newuri [uri::join {*}$uricomponents]
# ==> http://svn.example.com/repos/trunk
是的,dict with
非常适合这类事情。