TCL 中的 -> 运算符一般做什么,具体用正则表达式做什么?



以下是代码摘录:

#
# search the header for the base addresses of my slaves and other interesting properties
#
puts ""
puts "Searching "$system_header_file_path" for various system information..."
set C_M_N   [ string toupper $console_master_name ]
set sysid_base_re       "^[ t]*#define[ t]+$C_M_N_SYSID_BASE[ t]+(0x[0-9a-fA-F]+)"
set sysid_id_re         "^[ t]*#define[ t]+$C_M_N_SYSID_ID[ t]+([0-9a-fA-F]+)u"
set sysid_timestamp_re  "^[ t]*#define[ t]+$C_M_N_SYSID_TIMESTAMP[ t]+([0-9a-fA-F]+)u"
set build_id_base_re    "^[ t]*#define[ t]+$C_M_N_BUILD_ID_BASE[ t]+(0x[0-9a-fA-F]+)"
set gate_base_re        "^[ t]*#define[ t]+$C_M_N_GATE_BASE[ t]+(0x[0-9a-fA-F]+)"
set define_re           "^[ t]*#define[ t]+.*"
set sysid_base              "unknown"
set sysid_id                "unknown"
set sysid_timestamp         "unknown"
set build_id_base           "unknown"
set gate_base               "unknown"
set header_file [ open $system_header_file_path r ]
while { [ gets $header_file next_line ] >= 0 } {
if { [ regexp $define_re $next_line ] } {
if { [ regexp $sysid_base_re $next_line -> value ] } {
set sysid_base              $value
} elseif { [ regexp $sysid_id_re $next_line -> value ] } {
set sysid_id                $value
} elseif { [ regexp $sysid_timestamp_re $next_line -> value ] } {
set sysid_timestamp         $value
} elseif { [ regexp $build_id_base_re $next_line -> value ] } {
set build_id_base           $value
} elseif { [ regexp $gate_base_re $next_line -> value ] } {
set gate_base           $value
}
}
}
close $header_file

我正试图弄清楚这些事情:

文件I/O

  1. 打开命令是以文本文件还是二进制文件的形式打开文件?如果它以文本文件的形式打开,如何将其改为二进制文件打开
  2. 如何获取$header_file导致从文件中读取下一行?header_file是某种文件指针吗
  3. 为什么我们要检查gets返回的值是否为>=0,TCL没有eof功能吗

正则表达式

  1. 这是什么->正则表达式命令行中使用的运算符?据我所知,正则表达式命令也可以在没有此运算符的情况下使用

这是一个问题中的4个不同问题,所以如果它最终因需要更多关注而被关闭,请不要感到惊讶。无论如何。。。

文件I/O

  1. open默认情况下使用文本模式,转换为基于您的语言环境的字符编码。将b添加到打开模式以二进制模式打开,或在打开后使用fconfigure $header_file -translation binary。有关open的详细信息,请参阅帮助。

  2. 变量header_file包含一个符号,tcl i/o函数将该符号转换为内部文件描述符。gets的第一个自变量是其中一个描述符的名称。

  3. 带有两个参数的gets返回读取的字符数(或二进制模式下的字节数(,或在文件末尾尝试读取时返回-1(或在非阻塞模式下没有整行可用时返回(。您可以有空行,这将返回0。如果您不希望遇到空行,那么使用>而不是>=进行循环可能是合适的;这取决于你在做什么。gets帮助中的详细信息。

正则表达式:

  1. ->不是运算符,它是变量名。当您只关心捕获的子表达式时,在用于保持整个匹配的参数中使用regexp只是一种惯例

最新更新