#!/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{$_[1]} }, }, '=' => { # Complex email => sub { qq{$_[1]} }, url => sub { qq{$_[1]} }, img => sub { qq{$_[1]} }, }, ); 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{$_[1]} if $tag eq 'img'; } else { # Complex return qq{$_[1]} if $tag eq 'email'; return qq{$_[1]} if $tag eq 'url'; return qq{$_[1]} 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; # }, # } #);