The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# VOODOO LINE-NOISE
my($C,$M,$P,$N,$S);END{print"1..$C\n$M";print"\nfailed: $N\n"if$N}
sub ok{$C++; $M.= ($_[0]||!@_)?"ok $C\n":($N++,"not ok $C (".
((caller 1)[1]||(caller 0)[1]).":".((caller 1)[2]||(caller 0)[2]).")\n")}
sub try{$P=qr/^$_[0]$/}sub fail{ok($S=$_[0]!~$P,$_[0])}
sub pass{ok($S=$_[0]=~$P,$_[0])}

# LOAD

use Regexp::Common;
ok;

# MAKE THEM PROFANE

tr/A-Za-z/N-ZA-Mn-za-m/ foreach (@profanity, @contextual);


# TEST UNEQUIVOCABLE PROFANITIES 

try $RE{profanity};

pass $_ foreach @profanity;
fail $_ foreach @contextual;
fail $_ foreach @non_profanity;


# TEST CONTEXTUAL PROFANITIES 

try $RE{profanity}{contextual};

pass $_ foreach @profanity;
pass $_ foreach @contextual;
fail $_ foreach @non_profanity;


BEGIN {

@non_profanity = (
	       'love',
	       'peace',
	       'joy',
	       'honour',
	       'valour',
	       'house',
	       'street',
	       'parse',
	       'scrape',
	       'mishit',
	       'rectum',
	       'anus',
               'clitoris',
               'vagina',
               'breast',
	       'nipple',
               'penis',
	       'scrotum',
	       'foreskin',
);

}

BEGIN {
@profanity = (
               'oybj-wbo',
               'oybj-wbof',
               'pbpxfhpxvat',
               'pbpx-fhpxre',
               'pbpx-fhpxref',
               'pbpx-fhpxvat',
               'phag',
               'phagf',
               'srygpu',
               'srygpuvat',
               'srygpure',
               'srygpuref',
               'srygpurf',
               'srygpurq',
               'zbgure-shpxre',
               'zbgure-shpxref',
               'zbgure-shpxvat',
               'zhgure-shpxre',
               'zhgure-shpxref',
               'zhgure-shpxvat',
               'zhgun-shpxre',
               'zhgun-shpxref',
               'zhgun-shpxvat',
               'zhgun-shpxn',
               'zhgun-shpxn',
               'zhgun-shpxn',
               'shpx',
               'shpxf',
               'shpxvat',
               'shpxrq',
               'ohyy-fuvg',
               'ohyy-fuvgf',
               'ohyy-fuvggvat',
               'ohyy-fuvggrq',
               'ohyy-fuvggre',
               'ohyy-fuvggref',
               'uneq-ba',
               'fuvg',
               'fuvgf',
               'fuvggvat',
               'fuvggrq',
               'fuvggre',
               'fuvggref',
               'fuvggl',
               'fuvgr',
               'fuvgrf',
               'fuvgvat',
               'fuvgrq',
               'fuvgre',
               'fuvgref',
               'fuvgrl',
               'gjng',
               'gjngf',
               'gheq',
               'gheqf',
               'phzf',
               'phzvat',
               'phzzvat',
               'penc',
               'pencf',
               'penccre',
               'penccref',
               'penccvat',
               'penccrq',
               'penccl',
               'nff-ubyr',
               'nff-ubyrf',
               'nffvat',
               'nffrq',
               'unys-nffrq',
               'nefr',
               'nefrf',
               'nefr-ubyr',
               'nefvat',
               'nefrq',
               'unys-nefrq',
               'sneg',
               'snegf',
               'snegre',
               'snegvat',
               'snegrq',
               'snegl',
               'cvff',
               'cvffrf',
               'cvffre',
               'cvffref',
               'cvffvat',
               'cvffrq',
               'cvffl',
               'cvff-gnxr',
               'zreqr',
               'zreq',
               'dhvz',
               'dhvzf',
               'qvpx-urnq',
               'qvpxyrff',
               'qvpxvat',
               'qvpxrq',
               'qvpxf',
               'jnax',
               'jnaxf',
               'jnaxre',
               'jnaxref',
               'jnaxvat',
               'jnaxrq',
               'oybj wbo',
               'oybj wbof',
               'pbpx fhpxre',
               'pbpx fhpxref',
               'pbpx fhpxvat',
               'zbgure shpxre',
               'zbgure shpxref',
               'zbgure shpxvat',
               'zhgure shpxre',
               'zhgure shpxref',
               'zhgure shpxvat',
               'zhgun shpxre',
               'zhgun shpxref',
               'zhgun shpxvat',
               'zhgun shpxn',
               'zhgun shpxn',
               'zhgun shpxn',
               'ohyy fuvg',
               'ohyy fuvgf',
               'ohyy fuvggvat',
               'ohyy fuvggrq',
               'ohyy fuvggre',
               'ohyy fuvggref',
               'uneq ba',
               'nff ubyr',
               'nff ubyrf',
               'unys nffrq',
               'nefr ubyr',
               'unys nefrq',
               'cvff gnxr',
               'qvpx urnq',
               'oybjwbo',
               'oybjwbof',
               'pbpxfhpxre',
               'pbpxfhpxref',
               'pbpxfhpxvat',
               'zbgureshpxre',
               'zbgureshpxref',
               'zbgureshpxvat',
               'zhgureshpxre',
               'zhgureshpxref',
               'zhgureshpxvat',
               'zhgunshpxre',
               'zhgunshpxref',
               'zhgunshpxvat',
               'zhgunshpxn',
               'zhgunshpxn',
               'zhgunshpxn',
               'ohyyfuvg',
               'ohyyfuvgf',
               'ohyyfuvggvat',
               'ohyyfuvggrq',
               'ohyyfuvggre',
               'ohyyfuvggref',
               'uneqba',
               'nffubyr',
               'nffubyrf',
               'unysnffrq',
               'nefrubyr',
               'unysnefrq',
               'cvffgnxr',
               'qvpxurnq'
             );

@contextual = (
                'onyy',
                'onyyf',
                'onyyvat',
                'onyyrq',
                'onyyre',
                'onyyref',
                'onfgneq',
                'oybbql',
                'obar',
                'obarf',
                'obavat',
                'obare',
                'obaref',
                'ohttre',
                'pbpx',
                'pbpxf',
                'qvpx',
                'qbat',
                'qbatf',
                'uhzc',
                'uhzcre',
                'uhzcref',
                'uhzcf',
                'uhzcvat',
                'uhzcrq',
                'cevpx',
                'cevpxf',
                'cebax',
                'cbex',
                'chffl',
                'chffvrf',
                'ebbg',
                'ebbgf',
                'ebbgre',
                'ebbgref',
                'ebbgvat',
                'ebbgrq',
                'fperj',
                'fperjf',
                'fperjvat',
                'fperjrq',
                'funt',
                'funtf',
                'funttvat',
                'funttrq',
                'funttre',
                'funttref',
                'fbq',
                'fbqf',
                'fbqqvat',
                'fbqqrq',
                'fchax',
                'gvg',
                'gvgf'
              );
}