| 1 | #!/usr/bin/perl |
| 2 | # Censor filter. |
| 3 | # Copyright 2002 by Joey Hess under the terms of the GNU GPL. |
| 4 | |
| 5 | # Yes, this program is self-modifying code, if you want it to be. |
| 6 | if (exists $ENV{ADD_WORD}) { |
| 7 | open(IN, $0) || die "cannot read myself"; |
| 8 | @lines=<IN>; |
| 9 | close IN; |
| 10 | open OUT, ">$0" || die "cannot write myself"; |
| 11 | for (@lines) { |
| 12 | print OUT $_; |
| 13 | if (/^__DATA__\n$/) { |
| 14 | open(DATAOUT, "|sort|uniq|column >> $0"); |
| 15 | $ENV{ADD_WORD} =~ y/n-za-m/a-z/; |
| 16 | print DATAOUT "$ENV{ADD_WORD}\n"; |
| 17 | print DATAOUT join("\n", |
| 18 | map { chomp; split ' ', $_ } <DATA>); |
| 19 | close DATAOUT; |
| 20 | exit; |
| 21 | } |
| 22 | } |
| 23 | } |
| 24 | |
| 25 | $censored = join("|", reverse sort { $a cmp $b } |
| 26 | grep { length $_ } |
| 27 | map { chomp; y/a-z/n-za-m/; split ' ', $_ } <DATA>); |
| 28 | |
| 29 | while (<>) { |
| 30 | s/\b($censored)ed/CENSORED/ig; # don't say "CENSOREDed" |
| 31 | s/\b($censored)/CENSORED/ig; |
| 32 | print $_; |
| 33 | } |
| 34 | |
| 35 | __DATA__ |
| 36 | ahqr enaql gjng pbpx t-fcbg |
| 37 | anxrq encr grng pbzrvat t\f+fcbg |
| 38 | avccyr erne guebng pbzvat tebva |
| 39 | bcravat fangpu gvg pebgpu ubbgre |
| 40 | beny fchax gvggl penc ubeal |
| 41 | betl fcrez gvggvr penpx ubyr |
| 42 | betnfz fcuvapgre hgrehf pernz uhzc |
| 43 | certanag fghq ihyin phag unaqwbo |
| 44 | cevpx fgnss intvan phz urnq |
| 45 | chff fhpx ivetva phzzvat wvfz |
| 46 | chffl fjnyybj ivoengbe pnzr xabo |
| 47 | chffvrf fperj jbzo preivk xvff |
| 48 | chovp frk jrg pureel ybir |
| 49 | chqraqhz frkhny juber pyvg ybire |
| 50 | chzc frrq kkk pyvgbevf ybirq |
| 51 | cnagvrf frzra nany pyvggl ybnq |
| 52 | crargengr funsg nerbyn pyvznk ynovn |
| 53 | crargengrq funt nff qevyyrq ynvq |
| 54 | cravf funttvat nffubyr qrsybjre yrfovna |
| 55 | crgre fuvg obbo qvpx yvcf |
| 56 | crpxre fvrt\furvy oernfg qvyqb znfgheong |
| 57 | cunyyhf fyhg ohgg rebgvp znfgheongr |
| 58 | cvff fyhggvfu ohggbpx rerpgvba znfgheongvat |
| 59 | ebfrohq fyvg onyy rkcbfrq znzznel |
| 60 | ebq gbathr ovgpu shpx znzznevrf |
| 61 | ehg gbby oybj snpvny |