Я пишу proc для создания заголовка в выходном файле.
В настоящее время это должно взять дополнительный параметр, который является возможным комментарием для заголовка.
Я закончил тем, что кодировал это как единственный дополнительный параметр
proc dump_header { test description {comment = ""}}
но хотел бы знать, как я могу достигнуть того же использования args
proc dump_header { test description args }
Это довольно легко проверить на args быть единственным пустым параметром ($args ==""), но не справляется хорошо при передаче нескольких параметров - и мне нужна отрицательная проверка так или иначе.
Ваше определение процедуры неверно (вы получите сообщение об ошибке слишком много полей в спецификаторе аргумента "comment =" ""
). Должно быть:
proc dump_header { test description {comment ""}} {
puts $comment
}
Если вы хотите использовать args
, вы можете проверить llength
его:
proc dump_header {test desc args} {
switch -exact [llength $args] {
0 {puts "no comment"}
1 {puts "the comment is: $args"}
default {
puts "the comment is: [lindex $args 0]"
puts "the other args are: [lrange $args 1 end]"
}
}
}
Вы также можете передать пары имя-значение в списке:
proc dump_header {test desc options} {
# following will error if $options is an odd-length list
array set opts $options
if {[info exists opts(comment)]} {
puts "the comment is: $opts(comment)"
}
puts "here are all the options given:"
parray opts
}
dump_header "test" "description" {comment "a comment" arg1 foo arg2 bar}
Некоторые предпочитают комбинацию аргументов
и пар имя-значение (а-ля Tk)
proc dump_header {test desc args} {
# following will error if $args is an odd-length list
array set opts $args
if {[info exists opts(-comment)]} {
puts "the comment is: $opts(-comment)"
}
parray opts
}
dump_header "test" "description" -comment "a comment" -arg1 foo -arg2 bar
Я использую библиотеку tcllib cmdline для анализа параметров.
Это пример из документации cmdline:
set options {
{a "set the atime only"}
{m "set the mtime only"}
{c "do not create non-existent files"}
{r.arg "" "use time from ref_file"}
{t.arg -1 "use specified time"}
}
set usage ": MyCommandName \[options] filename ...\noptions:"
array set params [::cmdline::getoptions argv $options $usage]
if { $params(a) } { set set_atime "true" }
set has_t [expr {$params(t) != -1}]
set has_r [expr {[string length $params(r)] > 0}]
if {$has_t && $has_r} {
return -code error "Cannot specify both -r and -t"
} elseif {$has_t} {
...
}
Итак, в вашем случае вы должны просто использовать args
вместо argv
в приведенном выше примере.