我定义了两个局部变量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
答案 0 :(得分:2)
你的问题不在于在两行之间打破你的字符串,而是将它分成两部分。考虑
. local str3 "a" "bc"
. display "`str3'"
abc
. display strlen("`str3'")
1
查看help local
表明您尝试的语法 - 为宏提供两个字符串常量 - 不在文档语法的范围内。请考虑允许定义表达式的语法,并使用它来连接两个字符串。
. local str4 = "a" ///
> + "bc"
. display "`str4'"
abc
. display strlen("`str4'")
3
答案 1 :(得分:1)
这里的基本原则是你对str2
的定义具有无意义的结果,即在本地宏中包含中间双引号。因此,除非您通过 compound 双引号分隔宏,否则您将获得误导性结果。
同样重要的是,display
具有演示角色和报告角色,并在某种程度上解释了为其提供的内容。因此,它并不总是完全字面意义。特别是,在显示字符串之前,它将剥离分隔符或它认为是分隔符的分隔符。通常这是纯粹的功能,但在您的示例中,它会阻止您查看定义的后果。
" "
在Stata中有两个角色,字符串分隔符和文字字符这一事实。
. local str2 "a" ///
> "bc"
. display "`str2'"
abc
. display `"`str2'"'
a" "bc
. display strlen("`str2'")
1
. display strlen(`"`str2'"')
17