Tcl`file dirname`命令是否可用于URL?

时间:2015-06-11 09:35:00

标签: url svn tcl

从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发行版中。

1 个答案:

答案 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非常适合这类事情。