以下是代码摘录:
#
# 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
- 打开命令是以文本文件还是二进制文件的形式打开文件?如果它以文本文件的形式打开,如何将其改为二进制文件打开
- 如何获取$header_file导致从文件中读取下一行?header_file是某种文件指针吗
- 为什么我们要检查gets返回的值是否为>=0,TCL没有eof功能吗
正则表达式
- 这是什么->正则表达式命令行中使用的运算符?据我所知,正则表达式命令也可以在没有此运算符的情况下使用
这是一个问题中的4个不同问题,所以如果它最终因需要更多关注而被关闭,请不要感到惊讶。无论如何。。。
文件I/O
-
open
默认情况下使用文本模式,转换为基于您的语言环境的字符编码。将b
添加到打开模式以二进制模式打开,或在打开后使用fconfigure $header_file -translation binary
。有关open
的详细信息,请参阅帮助。 -
变量
header_file
包含一个符号,tcl i/o函数将该符号转换为内部文件描述符。gets
的第一个自变量是其中一个描述符的名称。 -
带有两个参数的
gets
返回读取的字符数(或二进制模式下的字节数(,或在文件末尾尝试读取时返回-1
(或在非阻塞模式下没有整行可用时返回(。您可以有空行,这将返回0。如果您不希望遇到空行,那么使用>
而不是>=
进行循环可能是合适的;这取决于你在做什么。gets
帮助中的详细信息。
正则表达式:
->
不是运算符,它是变量名。当您只关心捕获的子表达式时,在用于保持整个匹配的参数中使用regexp
只是一种惯例