2016-07-08 2 views
0

현재 현재 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 

이유는 start globsglob0에 포함 된 모든 정보를 전달하고 있지 않다?

print_globals `" ${glob0} "' 

하지 print_globals ${glob0} : 의도 한대로 프로그램 인수의 내용을 인쇄하기 위해

답변

0

args 문은 프로그램에 제공된 첫 번째 인수 만 로컬 매크로에 할당합니다. 다른 인수가 있으면 무시됩니다.

큰 문제는 큰 따옴표가 하나의 인수로 제공되는 것을 묶는 데 사용되는지 여부입니다.

전역 또는 로컬로 인수를 제공하는지 여부는 중요하지 않습니다. 프로그램이으로 실행되기 전에 명령 줄에서 언급 한 전역 및 지역은 으로 평가되며 그럴 수는 없습니다. 그 내용 만 프로그램에 전달됩니다. 이 지역`foo는에 할당 인수 foo``뒤에 주요 지점을 언급하지 않는

. showfirstarg $G 
A 

. showfirstarg "$G" 
A B C D E 

. showfirstarg `L' 
A 

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

고마워, 나는 또한 정확한 해결책에 맞춰 나의 대답을 수정했다. – Stezzo

+0

나는 또한 문서에서 이것을 강조하거나 최소한 이것을 언급 할 것을 제안한다. 나는 그것에 관해서 아무 것도 찾을 수 없다. 안부 – Stezzo

+0

정확히 "this"는 무엇인가?이 질문은 인수를 프로그램에 전달하고, 따옴표로 바인딩하고, 지역 매크로와 전역 매크로를 처리하는 방법 인'args' 명령을 결합합니다. 모두 [U] 또는 [P]에 문서화되어 있습니다. StataCorp에 직접 문서에 대한 제안을 전달합니다. 그들은 보통 이와 같은 스레드를 보지 않을 것입니다. –

0

, 하나는 복합 따옴표를 사용해야합니다.

은이를 보려면 다음 예를 살펴 :

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은 프로그램에 인수로 전달됩니다.

사실, 아래 주석에서 강조한 바와 같이, 후자의 경우에만 첫 번째 요소가 프로그램 인수 (예제에서는 a)로 전달됩니다. 복합 인용 부호를 사용하면 a b c d e을 단일 인수로 제공하고 최종 결과는 원하는 결과입니다.

+0

:

이 간단한 프로그램을 정의하고 가능성을 통해 실행

차례
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'" 

결과 '* first * 인수가 지정되었습니다. 따옴표로 묶으면 프로그램에 제공하는 항목이 하나의 인수가됩니다. 만약 그렇지 않다면, 그리고 어쨌든, 프로그램이 그것을보기 전에 Stata가 글로벌 또는 로컬을 평가합니다. 중요한 것은 매크로의 내용이 따옴표로 묶여 있는지 여부입니다. –

+0

전역 변수와 지역 변수의 차이점은'args'가 어떻게 동작하는지와 관련이 없습니다. –