宏中可怕的复合引用
Dreaded compound quoting in macros
我认为自己是高级 Stata 用户,但我就是不知道如何让复合引号对我有用。
我有两个宏,每个宏都包含复合引号列表,例如`"name with space"' `"nospace"'。我不知道如何将这些字符串块视为 space 分隔列表。
如果我创建一个不带引号的本地文件,它看起来像是一个由 space 分隔的列表。例如,
local test a b
. di "`test'"
a b
但是如果我将它们放在复合引号中,我会得到非常不同的结果:
. local test `"a"' `"b"'
. di "`test'"
a' invalid name
r(198);
. di `"`test"'
ab
如果我想将字符串块视为单独的项目,这就是一个问题,如下所示:
local set1 `"name with space"' `"nospace"'
. di `"`set1'"'
name with spacenospace
如何使宏成为字符串块列表(有或没有 spaces),由 spaces 分隔?我最终想迭代地构建这样一个宏,并用它来命名矩阵中的行。
我不知道这是否回答了你所有的问题。也许编辑问题并删除有关矩阵的所有内容。据我了解,您的问题是关于字符串和矩阵的,而恰好是您问题的背景。但我可能错了。如果您的问题仅与字符串有关,那么专注于字符串的可重现示例将提高您获得完整答案的机会。
在 local set1 `"name with space"' `"nospace"'
中,您连接了两个字符串 "name with space"
和 "nospace"
,但您没有告诉 Stata 在这些字符串之间添加 space。 Stata 不会在您未告知的情况下在这些字符串之间添加任何内容。
例如,您可以这样做:
local set1 `"name with space"' `" "' `"nospace"'
di `"`set1'"'
或:
local set1 `"name with space"' `" nospace"'
di `"`set1'"'
或者保存一串字符串:
local set1 `" "name with space" "nospace" "'
di `"`set1'"'
我认为自己是高级 Stata 用户,但我就是不知道如何让复合引号对我有用。
我有两个宏,每个宏都包含复合引号列表,例如`"name with space"' `"nospace"'。我不知道如何将这些字符串块视为 space 分隔列表。
如果我创建一个不带引号的本地文件,它看起来像是一个由 space 分隔的列表。例如,
local test a b
. di "`test'"
a b
但是如果我将它们放在复合引号中,我会得到非常不同的结果:
. local test `"a"' `"b"'
. di "`test'"
a' invalid name
r(198);
. di `"`test"'
ab
如果我想将字符串块视为单独的项目,这就是一个问题,如下所示:
local set1 `"name with space"' `"nospace"'
. di `"`set1'"'
name with spacenospace
如何使宏成为字符串块列表(有或没有 spaces),由 spaces 分隔?我最终想迭代地构建这样一个宏,并用它来命名矩阵中的行。
我不知道这是否回答了你所有的问题。也许编辑问题并删除有关矩阵的所有内容。据我了解,您的问题是关于字符串和矩阵的,而恰好是您问题的背景。但我可能错了。如果您的问题仅与字符串有关,那么专注于字符串的可重现示例将提高您获得完整答案的机会。
在 local set1 `"name with space"' `"nospace"'
中,您连接了两个字符串 "name with space"
和 "nospace"
,但您没有告诉 Stata 在这些字符串之间添加 space。 Stata 不会在您未告知的情况下在这些字符串之间添加任何内容。
例如,您可以这样做:
local set1 `"name with space"' `" "' `"nospace"'
di `"`set1'"'
或:
local set1 `"name with space"' `" nospace"'
di `"`set1'"'
或者保存一串字符串:
local set1 `" "name with space" "nospace" "'
di `"`set1'"'