Stata 斯塔塔:为什么不';这两条线不一样吗?

Stata 斯塔塔:为什么不';这两条线不一样吗?,stata,Stata,我定义了两个局部变量str1和str2,它们包含具有相同字符的字符串——唯一的区别是str2被分成了两行。它们都显示相同的字符串,但str2的长度仅为1,因此与str1不同。为什么会这样 local str1 "abc" display "`str1'" . abc display strlen("`str1'") // get string length . 3 local str2 "a" /// "bc" display "`str2'" . abc displa

我定义了两个局部变量str1和str2,它们包含具有相同字符的字符串——唯一的区别是str2被分成了两行。它们都显示相同的字符串,但str2的长度仅为1,因此与str1不同。为什么会这样

local str1 "abc"
display "`str1'"
. abc
display strlen("`str1'")  // get string length
. 3

local str2 "a" ///
           "bc"
display "`str2'"
. abc
display strlen("`str2'")
. 1

display ("`str1'" == "`str2'")
. 0

你的问题不在于把绳子断在两行之间,而在于把它分成两部分。考虑

. local str3 "a" "bc"
. display "`str3'"
abc
. display strlen("`str3'")
1
查看
help local
表明,您尝试的语法(为宏提供两个字符串常量)不在文档语法的范围内。而是考虑允许定义表达式的语法,并使用它来连接两个字符串。

. local str4 = "a" ///
>              + "bc"
. display "`str4'"
abc
. display strlen("`str4'")
3

这里最基本的一点是,您对str2的定义无疑是无意的,它会在本地宏中包含中间的双引号。因此,除非随后使用复合双引号分隔宏,否则将得到误导性结果

同样重要的是,
display
具有演示角色和报告角色,并在一定程度上解释向其提供的内容。因此,它并不总是完全字面意义上的。特别是,在显示字符串之前,它将去除分隔符,或者它认为是分隔符的内容。通常这是一个纯粹的特性,但在您的示例中,它使您无法看到定义的结果

因此,困惑的焦点在于双引号
在Stata中有两个角色,即字符串分隔符和文字字符

. local str2 "a" ///
>            "bc"

. display "`str2'"
abc

. display `"`str2'"' 
a"            "bc

. display strlen("`str2'")
1

. display strlen(`"`str2'"')
17

可能还值得注意的是,
macro dir
的结果显示的宏带有中间的双引号和未去除的封闭空白。进一步
strlen()。