【问题标题】:arguments for proc in TCLTCL 中 proc 的参数
【发布时间】:2012-11-30 17:35:36
【问题描述】:

有没有办法从命令行传递 proc 的参数?我在脚本中有我的过程。我想从命令行给出它的参数。 shell脚本中是否有类似“$@”的等效命令?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    您可以使用这些预定义变量获取命令行参数。

    $argc - number items of arguments passed to a script.
    $argv - list of the arguments.
    $argv0 - name of the script.
    

    【讨论】:

      【解决方案2】:

      命令行参数有很多部分:

      • $argv — “有用的”参数词的 Tcl 列表。不包括脚本的名称。
      • $argc — “有用的”参数词的数量(即 $argv 的长度);考虑到[llength $argv] 也能正常工作,因此很少使用。
      • $argv0 — 正在执行的主脚本的名称。
      • [info nameofexecutable] — 正在执行脚本的程序。通常称为 tclshwish(或带有版本号和扩展名的一些变体),但不一定如此。

      将所有“有用的”参数词(您通常认为是参数的所有词)传递给过程的最简单方法是这样做(假设 Tcl 8.5 或更高版本):

      theProc {*}$argv
      

      请注意,这必须在所有对proc 的调用完成之后进行; proc 是定义过程的命令,而不是过程的声明。 (不同之处?可以想象,可以在文件的更深处看到声明,但 Tcl 不能那样工作。)

      我经常喜欢在生产代码中将上述内容包含在一些异常处理中,以便可以很好地报告任何错误,而不是转储堆栈跟踪:

      if {[catch {theProc {*}$argv} msg]} {
          handleError $msg
      }
      

      在 8.5 之前,您需要一种更丑陋的方式:

      eval theProc $argv
      

      这仍然是安全的(在形式上),因为 Tcl 如何保证构造列表值,并且我们知道 $argv 是一个正确的列表。

      【讨论】:

        【解决方案3】:

        还有args 用于可变数量的参数。

        proc foo args {
            foreach arg $args {
                puts "arg=$arg"
            }
        }
        

        所以调用 foo 会打印这个:

        % foo 1
        arg=1
        % foo 1 2 3
        arg=1
        arg=2
        arg=3
        % 
        

        请注意,使用 $argv 调用此过程会将 $argv 的整个内容视为 $argc 列表中的单个元素:

        $ cat ar.tcl
        #!/usr/bin/tclsh
        proc foo args {
            foreach arg $args {
                puts "arg=$arg"
            }
        }
        
        foo $argv
        $ 
        $ ./ar.tcl 1 2 3
        arg=1 2 3
        

        您需要使用[lindex $args 0] 来获取真正的$argv

        【讨论】:

          猜你喜欢
          • 2011-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-06
          • 1970-01-01
          相关资源
          最近更新 更多