0

コード例を次に示します。

set my_ref {$undefined_array(some_key)}
set my_val [subst $my_ref]

戻り値:

can't read "undefined_array(some_key)": no such variable
    while executing
"subst $my_ref"

http://wiki.tcl.tk/1501によると

今のところこれをキャッチする方法はないようです

4

1 に答える 1

3

指定したsubstテキストに対して置換を実行しようとすると、一致する名前を持つ既存の変数が必要になります。そのような変数が存在しない場合substは、例外をスローしTCL LOOKUP VARNAMEます。

それをどう捉えるか?またはを使用して、通常どおりに失敗した に例外をキャッチできます。あなたが言及した議論は、失敗する前に例外をキャッチすることに関する AFAICTでしたが、これはまだ不可能だと思います。substcatchtry subst

到着予定時刻:

私の「差別的な試み」コメントの概念実証。このコードには多くの潜在的な問題がありますが、少なくとも基本的な方法を示しています。この例では、ハンドラーは値として大文字の独自の名前を持つ変数を作成することによって反応します。

# CAUTION: demonstration code, do not use without modification 
proc handler varName {
    upvar 1 $varName name 
    set name [string toupper $varName]
}
unset -nocomplain foo bar 
set baz xyz 
set str {$foo $bar $baz}
while true {
    try {
        subst $str 
    } on ok res {
        break 
    } trap {TCL LOOKUP VARNAME} {msg opts} {
        handler [lindex [dict get $opts -errorcode] end]
    }
}
set res
# -> FOO BAR xyz
于 2015-05-25T17:47:29.653 に答える