我是一名新的SAS学习者。这是SAS语句。
%if %sysfunc(prxmatch(/^(E0349646)$/i, &SYSUSERID.)) ne 0 %then %do;
我只知道“ E0348535”是用户ID,但无法理解整个语句。请解释此SAS宏。非常感谢!
答案 0 :(得分:0)
prxmatch
是SAS中的PERL正则表达式函数。该语句正在检查用户ID名称是否包含E0349646
。 prxmatch
返回发生匹配的第一个位置。如果找不到匹配项,则为0。
%sysfunc()
是宏函数,可让您在宏内使用SAS函数。由于prxmatch
是宏中使用的SAS函数,因此必须用%sysfunc()
括起来。
最后,ne
是not equals
的另一种说法。综上所述,这是用简单的英语执行的语句:
If the user ID contains 'E0349646', then do some stuff.
答案 1 :(得分:0)
首先介绍术语。 SAS宏处理器是一种可以操纵文本并将结果传递到实际SAS系统进行解释的工具。那一行代码正在使用宏处理器语句,但是它不是完整的宏定义。实际上,从SAS 9.4(我认为可能是维护版本9.4m4?)开始,您可以在常规SAS程序中使用%if/%then/%do
类型的语句,而不必完全定义实际的宏。
因此,您拥有的是一个宏%if
语句。通用格式为:
%if condition %then statement ;
由于%then
部分后面的语句是%do
宏语句,因此您的程序将需要一个%end;
语句来标记条件为true时要执行的块的结尾。
让我们看看您的%if
语句中要测试的条件。
%sysfunc(prxmatch(/^(E0349646)$/i, &SYSUSERID.)) ne 0
因此,这是使用宏函数%sysfunc()
来让您用宏代码调用SAS函数prxmatch()
。这是实现Perl正则表达式的函数组的一部分。您还引用了名为SYSUSERID
的宏变量。该特定的宏变量是SAS自动创建的一个宏变量,以包含运行SAS程序的用户的用户ID。 prxmatch()
函数调用中使用的正则表达式正在测试值是否等于E0349646
,忽略大小写。结果将是要搜索的字符串中第一个找到的位置的位置。如果找不到,它将返回0。(SAS与人类一样,使用从1开始而不是从0开始的索引。)。
请注意,在正则表达式中包含^
和$
意味着它需要匹配完整的字符串。因此,您正在测试E0349646是否正在运行该程序。
直接进行测试就更容易了,而无需使用正则表达式或使用非宏函数调用。
%if %upcase(&sysuserid)=E0349646 %then %do;