了解如何将宏参数传递给 Stata 中的程序

Understanding how to pass macro arguments to a program in Stata

我目前正在编写一个小程序来打印当前Stata会话的全局宏变量。

我无法理解以下代码段的结果:

macro drop _all
global glob0: all globals 

cap program drop print_globals
program define print_globals
args start_globs

    di "$glob0"
    di "`start_globs'"

end

print_globals $glob0

结果是:

S_level S_ADO S_StataMP S_StataSE S_FLAVOR S_OS S_OSDTL S_MACH
S_level

为什么我不将 glob0 中包含的全部信息传递给 start globs

为了按预期打印程序参数的内容,必须使用复合引号:

print_globals `" ${glob0} "'

而不是 print_globals ${glob0}

要了解这一点,请考虑以下示例:

local A "a b c d e"
global B "a b c d e"

cap program drop print_prog
program define print_prog
args loc_input
    di "print global: $B"
    di "print local: `loc_input'"
end

print_prog `A'        
print_prog `" `A' "'  // prints both A and B as initially intended

这里的混淆是因为 B 是按预期打印的,而不必使用复合引号,而本地宏 A 作为参数传递时,这并不适用到程序。

事实上,正如下面评论中强调的那样,在后一种情况下,只有 first 元素作为程序参数传递(示例中的 a)。 通过使用复合引号,我们提供 a b c d e 作为单个参数,最终结果就是我们想要的结果。

您的 args 语句仅将提供给程序的第一个参数分配给本地宏;如果还有其他参数,它们将被忽略。

问题的实质是双引号是否用于将提供的内容绑定到一个参数中。

您提供的参数是全局参数还是局部参数并不重要:命令行中提到的全局参数和局部参数在程序 甚至 运行s 和不被视为如此;只有它们的内容被传递给程序。

定义这个更简单的程序并运行通过可能性:

program showfirstarg 
    args first 
    di "`first'" 
end 

global G "A B C D E" 
local L "A B C D E" 

showfirstarg $G 
showfirstarg "$G"
showfirstarg `L' 
showfirstarg "`L'"  

结果依次为:

. showfirstarg $G 
A

. showfirstarg "$G"
A B C D E

. showfirstarg `L' 
A

. showfirstarg "`L'"  
A B C D E