我是tcl的新用户,只能在4天内体验这个编程脚本。
我试图访问消息文件。教师只介绍了msg命令,如msgcreate,msgget,msgread .....等。
这就是文件的样子:
NK1|1|ELIZABETH POTTER^^^^^^L|MOTHER|RIDLEYTON NURSIN NK1|1|MARK DAVIES^^^^^^L|CARER|C/- CARA Pty.Ltd.^""^WOODVIL8|C2||||||||||||||||||||||||||||||| PV1||I|EPIC^^^0014^^084^0014^^EMERGENCY PATIENTS IN CARE|""|||
如果索引5是O或I,我想读取第3行来确定。
##Field
set field [string match *|O|* [msgget $mh]]
set out "|O|"
if {$field == $out} {
echo Patient class field: Outpatient
} else {
echo Patient class fiedl: Inpatient
}
我意识到这段代码只读取了文件的第一行,所以它总是回应住院病人。
答案 0 :(得分:1)
msgget
似乎会读取一行,对应一条记录。哪个好;它很可能是标准Tcl命令gets
的抽象。 (这个答案的其余部分假定这是真的。)
一旦你有了记录,你必须将它分成字段,然后你可以检查它的值。由于|
似乎是记录分隔符,因此您可以通过以下方式拆分:
set fields [split $record "|"]
这会生成一个列表,您可以选择第二个元素:
set secondField [lindex $field 1]; # <<< zero-base indexes, like in C
结合这些:
set fields [split [msgget $mh] "|"]
set out "0"
if {[lindex $fields 1] eq $out} {
# ...
}
请注意,因为您可能要处理许多字段,lassign
命令(Tcl 8.5中的新命令,但希望您不是旧版本)可以创建奇迹:
lassign [split [msgget $mh] "|"] code inpatient name status location ...
这是最适合这种工作的。
(如果您正在处理固定宽度字段 - 不太可能,但可能 - 那么您应该string range
或scan
。)