文件名分割和实例化

时间:2015-03-24 04:52:08

标签: foreach tcl

set session_list [list ../../TIMING_ANALYSIS_CRPR/FUNC_ss28_0.85V_0.95V_0.85V_125C_RCmax/reports.15_03_10-22/SAVED_SESSION    ../../TIMING_ANALYSIS_CRPR/FUNC_ff28_0.85V_0.95V_0.85V_m40C_Cmin/reports.15_03_10-22/SAVED_SESSION ]

foreach j $session_list {
  lappend x  [regsub {^../../TIMING_ANALYSIS_CRPR/} $j ""]
}

foreach p $x {
   lappend y [regsub {[^...]reports.15_03_10-22/SAVED_SESSION} $p ""]
}

foreach item $y {
  lappend r "create_scenario -name $item"
}

foreach term $r {
  lappend k  " $term -image ./../   "
}

这是我创建的代码,所需的结果是:

create_scenario -name  FUNC_ss28_0.85V_0.95V_0.85V_125C_RCmax -image ./../FUNC_ss28_0.85V_0.95V_0.85V_125C_RCmax/reports.15_03_10-22/SAVED_SESSION        
create_scenario -name  FUNC_ff28_0.85V_0.95V_0.85V_m40C_Cmin -image ./../UNC_ff28_0.85V_0.95V_0.85V_m40C_Cmin/reports.15_03_10-22/SAVED_SESSION

我如何实现这一目标?我的主要问题是在最后foreach语句中调用列表“x”。还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

你可以(我甚至会说应该)使用单个循环,因为你对列表的所有元素做同样的事情。根据我的理解,您需要在../../TIMING_ANALYSIS_CRPR之后获取该部件以获取名称,图像是名称及其后的所有内容。

因此,我不想删除不想要的内容,而是希望“捕获”#39;他们想要的是这样的:

# Just another way to have a list
set session_list {
    ../../TIMING_ANALYSIS_CRPR/FUNC_ss28_0.85V_0.95V_0.85V_125C_RCmax/reports.15_03_10-22/SAVED_SESSION
    ../../TIMING_ANALYSIS_CRPR/FUNC_ff28_0.85V_0.95V_0.85V_m40C_Cmin/reports.15_03_10-22/SAVED_SESSION
}

foreach item $session_list {
    regexp -- {TIMING_ANALYSIS_CRPR/(([^/]+).+)} $item -> image name
    set result "create_scenario -name $name -image ./../$image"
    puts $result
}
# Prints:
# create_scenario -name FUNC_ss28_0.85V_0.95V_0.85V_125C_RCmax -image ./../FUNC_ss28_0.85V_0.95V_0.85V_125C_RCmax/reports.15_03_10-22/SAVED_SESSION
# create_scenario -name FUNC_ff28_0.85V_0.95V_0.85V_m40C_Cmin -image ./../FUNC_ff28_0.85V_0.95V_0.85V_m40C_Cmin/reports.15_03_10-22/SAVED_SESSION

ideone demo

在正则表达式中,([^/]+)将匹配并捕获除TIMING_ANALYSIS_CRPR/之后的正斜杠字符以外的所有字符。然后,加上.+(在(([^/]+).+)中获取名称,自.以来名称后面的所有内容都匹配所有字符。

现在,正则表达式可能有点令人困惑,因为我们首先得到图像然后是名称,但那是因为外部括号首先出现,然后名称在其中。


如果您不想(或者您发现正则表达式太难),您可以尝试使用file命令:

foreach item $session_list {
    # Split on the directories
    set elements [file split $item]

    # Get the position of TIMING_ANALYSIS_CRPR
    set id [lsearch $elements "TIMING_ANALYSIS_CRPR"]

    # The name is just after it so...
    set name [lindex $elements $id+1]

    # The image is everything after the id:
    set image [file join [lrange $elements $id+1 end]]
    # Or if file join somehow is not using forward slashes:
    # set image [join [list [lrange $elements $id+1 end]] "/"]

    set result "create_scenario -name $name -image ./../$image"
}

注意:如果您使用的是Tcl8.4或更早版本,我使用的是Tcl8.6,某些语法必须更改