SO上已有多个good discussions regular expressions and empty lines。如果它是重复的话,我会删除这个问题。
有人可以解释为什么此脚本会输出5 3 4 5 4 3
而不是4 3 4 4 4 3
吗?当我在调试器$blank
中运行它时,$classyblank
保持在“4”(我假设它是正确的值),直到print语句之前。
my ( $blank, $nonblank, $non_nonblank,
$classyblank, $classyspace, $blanketyblank ) = 0 ;
while (<DATA>) {
$blank++ if /\p{IsBlank}/ ; # POSIXly blank - 4?
$nonblank++ if /^\P{IsBlank}$/ ; # POSIXly non-blank - 3
$non_nonblank++ if not /\S/ ; # perlishly not non-blank - 4
$classyblank++ if /[[:blank:]]/ ; # older(?) charclass blankness - 4?
$classyspace++ if /^[[:space:]]$/ ; # older(?) charclass whitespace - 4
$blanketyblank++ if /^$/ ; # perlishly *really empty* - 3
}
print join " ", $blank, $nonblank, $non_nonblank,
$classyblank, $classyspace, $blanketyblank , "\n" ;
__DATA__
line above only has a linefeed this one is not blank because: words
this line is followed by a line with white space (you may need to add it)
then another blank line following this one
THE END :-\
是否与__DATA__
部分有关,还是我误解了POSIX正则表达式?
PS:
正如对elsewhere及时帖子的评论所述,“真空”(/^$/
)可能会错过非空虚:
perl -E 'my $string = "\n" . "foo\n\n" ; say "empty" if $string =~ /^$/ ;'
perl -E 'my $string = "\n" . "bar\n\n" ; say "empty" if $string =~ /\A\z/ ;'
perl -E 'my $string = "\n" . "baz\n\n" ; say "empty" if $string =~ /\S/ ;'
答案 0 :(得分:2)
/\p{IsBlank}/
不检查空字符串。 \p
匹配具有指定Unicode属性的字符。
$ unichars '\p{IsBlank}' | cat
---- U+0009 CHARACTER TABULATION
---- U+0020 SPACE
---- U+00A0 NO-BREAK SPACE
---- U+1680 OGHAM SPACE MARK
---- U+2000 EN QUAD
---- U+2001 EM QUAD
---- U+2002 EN SPACE
---- U+2003 EM SPACE
---- U+2004 THREE-PER-EM SPACE
---- U+2005 FOUR-PER-EM SPACE
---- U+2006 SIX-PER-EM SPACE
---- U+2007 FIGURE SPACE
---- U+2008 PUNCTUATION SPACE
---- U+2009 THIN SPACE
---- U+200A HAIR SPACE
---- U+202F NARROW NO-BREAK SPACE
---- U+205F MEDIUM MATHEMATICAL SPACE
---- U+3000 IDEOGRAPHIC SPACE
它匹配" \n"
,因为SPACE具有IsBlank属性。
/[[:blank:]]/
不检查空字符串。 [...]
匹配作为指定类成员的字符。
$ unichars '[[:blank:]]' | cat
---- U+0009 CHARACTER TABULATION
---- U+0020 SPACE
---- U+00A0 NO-BREAK SPACE
---- U+1680 OGHAM SPACE MARK
---- U+2000 EN QUAD
---- U+2001 EM QUAD
---- U+2002 EN SPACE
---- U+2003 EM SPACE
---- U+2004 THREE-PER-EM SPACE
---- U+2005 FOUR-PER-EM SPACE
---- U+2006 SIX-PER-EM SPACE
---- U+2007 FIGURE SPACE
---- U+2008 PUNCTUATION SPACE
---- U+2009 THIN SPACE
---- U+200A HAIR SPACE
---- U+202F NARROW NO-BREAK SPACE
---- U+205F MEDIUM MATHEMATICAL SPACE
---- U+3000 IDEOGRAPHIC SPACE
它匹配" \n"
,因为SPACE是[:blank:]
POSIX字符类的成员,因此是[[:blank:]]
字符类的成员。