1

この問題は、SolarisとLinuxの両方で、tclバージョン8.3/8.4で発生しました。

次のコードを参照してください。

#!/usr/bin/tclsh

set pattern "this is * and *"
set str "this is tcl and c++"

switch -glob $str {

  $pattern {
    puts "matched pattern"
  }
  "this is * and *" {
    puts "matched plain text"
  }
  default {
    puts "matched none"
  }

}

結果は「一致したプレーンテキスト」です。$ patternと一致するはずですが、これはスイッチの誤った使用法ですか、それとも-globオプションに正しいパターンを指定していませんか?

誰かがいくつかのアイデアを与えてください、そしてあなたがそれをスイッチと変数で実行するようにコードを修正する方法を教えることができればそれはより良いです。

ありがとう!XM

4

1 に答える 1

7

Tcl の解析/置換がどのように機能するかを誤解していると思います。具体的には、glob コマンドは引数を取得しています。

1: -glob
2: $str
3: {

  $pattern {
    puts "matched pattern"
  }
  "this is * and *" {
    puts "matched plain text"
  }
  default {
    puts "matched none"
  }

}

{...} コンストラクトは、その中のものを単一の置換されていない (逐語的な) データに「グループ化」します。そのため、switch の 3 番目の引数には、$pattern をパターン変数の値に置き換えた結果ではなく、"$pattern" が含まれます。

置換が必要な場合は、中括弧の使用を避ける必要があります (簡略化しています)。したがって、実際にパターンの値を置き換えたい場合は、他の形式のスイッチを使用するのが最も簡単な方法です (各パターン/コード ブロックを個別の引数として渡します)。

switch -glob $str $pattern {
    puts "matched pattern"
} "this is * and *" {
    puts "matched plain text"
} default {
    puts "matched none"
}

注意として、一致する文字列に変数置換を使用している場合は、ほとんどの場合、スイッチで -- (これ以上のフラグはありません) フラグを使用することをお勧めします。$strこれにより、 yourに a で始まるものが含まれるという問題が回避されます-

switch -glob -- $str $pattern {
    puts "matched pattern"
} "this is * and *" {
    puts "matched plain text"
} default {
    puts "matched none"
}
于 2010-07-16T03:59:42.227 に答える