#!/usr/bin/perl -w
use strict;
my $data = <<'EOF';
[url="http://www.foo.bar.com"]foobar[/url]
[url]http://www.foo.bar.com[/url]
[img]http://example.com/prettylady.gif[/img]
[img="http://example.com/prettylady.gif"]Pretty Lady[/img]
[email="bruce.gray@acm.org"]Util[/email]
[b]bold[/b]
[i]ital[/i]
[u]under[/u]
[em]emph[/em]
[strong]smelly[/strong]
EOF
my %taglist = (
'' => { # Simple
b => sub { qq{$_[1]} },
i => sub { qq{$_[1]} },
u => sub { qq{$_[1]} },
em => sub { qq{$_[1]} },
strong => sub { qq{$_[1]} },
url => sub { qq{$_[1]} },
img => sub { qq{} },
},
'=' => { # Complex
email => sub { qq{$_[1]} },
url => sub { qq{$_[1]} },
img => sub { qq{} },
},
);
sub tagsub {
my $tag = shift;
my $equals_sign = shift;
if ( not $equals_sign ) { # Simple
return qq{$_[1]} if $tag eq 'b';
return qq{$_[1]} if $tag eq 'i';
return qq{$_[1]} if $tag eq 'u';
return qq{$_[1]} if $tag eq 'em';
return qq{$_[1]} if $tag eq 'strong';
return qq{$_[1]} if $tag eq 'url';
return qq{} if $tag eq 'img';
} else { # Complex
return qq{$_[1]} if $tag eq 'email';
return qq{$_[1]} if $tag eq 'url';
return qq{} if $tag eq 'img';
}
}
my $pat = qr{\[(\w+)(=?)['"]?([^\]]*?)['"]?\](.+?)\[/\1\]};
$_ = $data;
s/$pat/$taglist{$2}{$1}->($3,$4)/esg;
print "Run # 1:\n$_\n";
$_ = $data;
s/$pat/tagsub($1,$2,$3,$4)/esg;
print "Run # 2:\n$_\n";
# Boost size of $data to 10240 lines.
#$data .= $data for 1 .. 10;
#
#use Benchmark qw(cmpthese);
#cmpthese(
# -300,
# {
# hash_sub => sub{
# $_ = $data;
# s/$pat/$taglist{$2}{$1}->($3,$4)/esg;
# },
# one_sub => sub{
# $_ = $data;
# s/$pat/tagsub($1,$2,$3,$4)/esg;
# },
# }
#);