使用双阴性:
/[^Sn]/
在perlport上警告w和n映射,以避免平台差异:
/[^Sx0ax0d]/
也就是说,关于排除CR和NL的模式,不是空白,就是不是新的行或类似的。
使用De Morgan定律分配外部非(即字符类的补充(w ) )相当于“空白而不是换行符”,但请不要相信我的话:
#! /usr/香蕉发箍/env perl
use strict;
use warnings;
use 5.005; # for qr//
my $ws_not_nl=qr/[^Sx0ax0d]/;
for ()、() f )、(t )、(r )、(n ) )。
my $qq=qq['$_'];
printf '%-4s=%sn ',$qq,
(eval $qq ) ) (=~ $ws_not_nl? ' match' : 'no match ';
}
输出:
' '=match
'f'=match
't'=match
'r '=不匹配
'n '=不匹配
请注意,排除垂直选项卡。 但是,这已经在v5.18中解决了。
这个技巧也便于匹配字母字符。 请记住要匹配“单词字符”、字母字符、数字和下划线。 我们丑陋的美国人有时想把它写下来。 例如,
if(/^[a-za-z]$/) { . }
但是,双负载字符类可以尊重区域设置。
if(/^[^wd_]$/) { . }
这有点不透明,所以POSIX字符类可能更容易表达意图
if (/^ [ [ : alpha : ] ) $/({ . }
或者像szbalint建议的那样
if(/^(p ) letter ) $/)…}