0

「subliner3」と呼ばれる再帰的な手順を書いています。簡単にするために、次のように置き換えます。

  1. [object method]Object->method()
  2. [object method:attr1 attr2 ...]object->method(attr1,attr2,...)

(2) の中で (1) と (2) を置き換えるのは再帰的です。どの属性も (1) または (2) のようになります。

したがって、このコードは問題を引き起こします:

while {[regsub -all {\[([^\[\]:]+)[:]([^\[\]]+)\]} $subline "[subliner3 "\\1" "\\2"]" subline]} {}

これは、サブライン (サブラインは属性リスト) で正確に (2) を見つけて、関数を再度呼び出すことになっています。問題は、subline が regsub の \1 と \2 で呼び出されると、subliner3 が実際に "\1" と "\2" を取得するため、subliner3 の呼び出し後に解釈されるように見えることです。解釈された \1 & \2 で [subliner3 "\1" "\2"] を呼び出すにはどうすればよいですか?

サンプル入力:

[self runAction:[CCSequence actions:[CCDelayTime actionWithDuration:5], [CCCallFunc actionWithTarget:self selector:@selector(resetMessage)], nil]]; 

出力:

self->runAction(CCSequence::actions(CCDelayTime::actionWithDuration(5), CCCallFunc::actionWithTarget(self, @selector(resetMessage)), nil);
4

2 に答える 2

0

expr \"[ regsub -all {(1)} "number 1" "[getSp \1]"]\" したがって、最初に、regsub は (1) を \1 の位置に置くことができます。次に、expr は getSp を呼び出すようにします。また、\1 ではなく (1) で呼び出されます。しかし、このソリューションを使用するには、regsub によって返される文字列が [ ] プロシージャに対してのみ指定されていることを確認する必要がありますが、常にそうであるとは限りません。たとえば、regsub 呼び出しの後の文字列は次のようになります 。 ]; subliner3 - のみが手順です。

于 2012-08-25T09:08:30.540 に答える
0

あなたはそれを行うことができます(配列を使用しないなどのいくつかの仮定の下で)が、実際には裏返しに作業し、置換コードをループに入れる必要があります。

# Your sample as input
set string {[self runAction:[CCSequence actions:[CCDelayTime actionWithDuration:5], [CCCallFunc actionWithTarget:self selector:@selector(resetMessage)], nil]];}

# Do most of the replacements, recursively.
#
# Note that some parts are changed to \001stripExtra stuff\002, because we need
# to do further processing on the arguments which can't quite be done in this
# looped [regsub].
while {[regsub -all {\[(\w+) (\w+):([^]]+)\]} $string \
        "\\1::\\2(\u0001stripExtra \\3\u0002)" string]} {}

# The further processing to do on arguments (removing selectors)
proc stripExtra args {
    foreach s $args {
        # The lack of a fourth argument means [regsub] returns the string
        lappend t [regsub {^\w+:(?!:)} [string trimright $s ","] {}]
    }
    return [join $t ","]
}
# Apply the further processing by converting to a substitutable string
set string [subst [string map {\u0001 "\[" \u0002 "\]"} $string]]

# Now transformed...
puts $string

上記のコードは、Objective-C を実際に理解していないため、かなり脆いため、実際の入力データに対して出力が適切であることを確認する必要があります…</p>

于 2012-08-25T15:26:01.463 に答える