了解如何将宏参数传递给 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
我目前正在编写一个小程序来打印当前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