天儿真好,
我使用以下Perl片段从Solaris集群命令中提取输出。
open(CL,"$clrg status |");
my @clrg= grep /^[[:lower:][:space:]]+/,<CL>;
close(CL);
当我打印数组元素的内容时,我得到以下内容@clrg BTW“=&gt;”和“&lt; =”行分隔符由我的print语句插入:
=><=
=>nas-rg mcs0.cwwtf.bbc.co.uk No Online<=
=> mcs1.cwwtf.bbc.co.uk No Offline<=
=><=
=>apache-rg mcs0.cwwtf.bbc.co.uk No Online<=
=> mcs1.cwwtf.bbc.co.uk No Offline<=
=><=
当我用以下Perl片段替换它时,空行不匹配。
open(CL,"$clrg status |");
my @clrg= grep /^[[:lower:][:space:]]{3,}/,<CL>;
close(CL);
我得到以下内容:
=>nas-rg mcs0.cwwtf.bbc.co.uk No Online<=
=> mcs1.cwwtf.bbc.co.uk No Offline<=
=>apache-rg mcs0.cwwtf.bbc.co.uk No Online<=
=> mcs1.cwwtf.bbc.co.uk No Offline<=
简单的问题是为什么?
BTW在第二个Perl片段中使用{1,}也匹配空行!
感激不尽的任何建议!
欢呼声,
答案 0 :(得分:9)
那将是因为[:space:]
也匹配换行符和回车符。
所以[[:space:]]+
会匹配\n
,\r\n
或\n\n
。
但[[:space:]]{3,}
需要三个字符,空行只需\n
。
{1,}
和+
表示相同的事情:将前一组匹配一次或多次。
P.S。典型的换行符是Unix上的\n
和Windows上的\r\n
。
答案 1 :(得分:1)
嗯。根据{{3}},[:space:]
字符类不应包含换行符,因为它应该等同于\s
(除了它识别另一个字符,vertical-tab,以维护POSIX合规性。)
然而,刚刚在5.10.0上测试了这个,我可以验证它是否也匹配换行符。无论这是否属于Perl或文档中的错误,我都将留给Perl维护者。但要避免直接问题,请使用之前的回答者解决方案,只使用\s
而不是POSIX类。