2014-01-16 38 views
2

我创建了下列程序,它不能很好地与字符串表达式配合使用。我一直无法找出正确的调整来添加我的语法定义以使其按预期工作。自定义程序 - 调试语法

我觉得这个东西很小,但是我还没有把它弄清楚。或者,引用一些有用的东西也将被赞赏。

包括程序和一些产生相同错误的虚拟代码。

谢谢!

cap program drop repl_conf 
program define repl_conf 
    syntax varlist =exp [if] 
    qui count `if' 
    if r(N) ==0 { 
    di as err "NO MATCHES -- NO REPLACE" 
    exit 9 
    } 
    else { 
    noi dis "SUCCESSFUL REPLACE of >=1 OBS -- " r(N) " OBS replaced" 
    qui replace `varlist' `exp' `if' 
    } 
end 

sysuse auto, clear 
repl_conf length=999 if length==233 
repl_conf make="ZZZ" if make=="AMC Concord" 
type mismatch 
r(109); 
+0

我认为这里的'exp'只能是一个带数字结果的表达式。当提供一个字符串结果时,你的程序不会传递'syntax'语句。 –

+0

我想你需要使用'gettoken'来逐个剥离命令行中的令牌。 –

+0

这似乎是一个不幸的功能。 'replace'和'gen'都使用字符串或数字'exp's,但它们都是内置命令。 –

回答

3

这会更进一步。我移动了第二条消息,以便仅在replace成功时发出。

program define repl_conf 
    gettoken varname 0 : 0, parse(=) 
    confirm var `varname' 
    gettoken eq 0 : 0, parse(=) 
    syntax anything [if] 
    qui count `if' 
    if r(N) == 0 { 
     di as err "NO MATCHES -- NO REPLACE" 
     exit 9 
    } 
    else { 
     qui replace `varname' = `anything' `if' 
     noi di "SUCCESSFUL REPLACE of >=1 OBS -- " r(N) " OBS replaced" 
    } 
end 

sysuse auto, clear 
repl_conf length=999 if length==233 
repl_conf make="ZZZ" if make=="AMC Concord" 
+0

非常感谢,@NickCox。这有效,并帮助我修复了后来遇到麻烦的'gettoken'语法。 – SOConnell