游戏计划是打开文件,读取内容,然后将该内容视为列表。然后,您可以使用lsearch
(list search) 命令,如果未找到该值,该命令将返回 -1:
proc is_holiday {the_date} {
set infile [open public-holiday-dates.txt]
set holidays [read $infile]
close $infile
if {[lsearch $holidays $the_date] == -1} {
return 0
} else {
return 1
}
}
使用它
您可以通过以下方式调用此过程:
if {[is_holiday $today_date_is]} {
puts "Is a holiday"
} else {
puts "Is not a holiday"
}
讨论
- 该过程的前三行
is_holiday
处理打开假期文件、读取内容和关闭 - 直截了当,但我稍后会详细讨论该文件。
- 下一个块,该
if
命令测试搜索结果:-1 表示未找到,因此该过程返回 0。否则返回 1——同样,这非常简单。
我可以将整个if
块组合成一个语句,但为了可读性,我选择不这样做,尤其是对于初学者。我确信该块比以下更具可读性:
return [expr {[lsearch $holidays $the_date] != -1}]
- 此过程在每次调用时打开/读取/关闭假期文件。如果您经常调用它(例如,几千次),那么您可能希望重组代码以仅读取一次以优化速度。
回到文件名,该过程当前将文件名硬编码(假设)为public-holiday-dates.txt,这不是一个好习惯。如果文件名改变了怎么办?如果你想在不同的文件中搜索怎么办?处理此问题的一种方法是允许调用者有选择地指定文件名。
proc is_holiday {the_date {holiday_filename public-holiday-dates.txt}} {
set infile [open $holiday_filename]
set holidays [read $infile]
close $infile
if {[lsearch $holidays $the_date] == -1} {
return 0
} else {
return 1
}
}
现在,如果你想指定一个不同的日历文件:
is_holiday $today_date_is other_calendar.txt