if ($item eq 'thing1') { # ... }
elsif ($item eq 'thing2') { # ... }
elsif ($item eq 'thing3') { # ... }
elsif ($item eq 'thing4') { # ... }
else { # ... }
####
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Std;
use HTML::Template;
use List::Util;
my %opt;
get_args(\%opt);
my $template = HTML::Template->new(filename => 'bench.tmpl');
$template->param(CHAIN_LENGTH => $opt{n});
$template->param(UNMATCHED_ITEMS => $opt{u});
my @chain = map {ITEM => $_}, 2 .. $opt{n};
$template->param(CHAIN => \@chain);
my $unmatched_items = int(($opt{u} / 100) * $opt{t});
$unmatched_items ||= 1 if $opt{u};
my @input = (-1) x $unmatched_items;
my $total = $opt{t} - $unmatched_items;
my @weight = $opt{w}
? sort {$b <=> $a} grep $_, split /[%,]|\s+/, $opt{w}
: (int(100/$opt{n})) x $opt{n};
for (1 .. $opt{n}) {
my $amount = shift @weight;
push @input, ($_) x (int(($amount/100) * $total) || 1);
}
$_ = {FIND => $_} for @input;
@input = List::Util::shuffle(@input) if ! $opt{o};
$template->param(BUILD_FIND => \@input);
print $template->output();
sub get_args {
my $opt = shift @_;
my $Usage = qq{Usage: $0 [options]
-h : This help message
-n : The (n)umber of items in the if/elsif chain
Default: 5
-t : The (t)total number of items to process
This number need not be the same as your actual data.
It should be sufficient to exercise the options
Default: -n * 10
-u : The percentage of (u)nmatched items to include
Typical if/elsif chains end with a catch-all else
This option allows you to determine how often this is used
Default: 0
-o : Specifies if the if/elsif chain should be (o)rdered
If the input data is well known, it is possible to order
the if/elsif chains to ensure the most common items are first
Default: 0 (off)
-w : The (w)eight in percentages of the matched input
Ignored unless -o option also specified
There must be as many #% as there are -n to work correctly
The #% must add up to 100 to work correctly
The -b option, if present, takes precedence before this option
For instance, if you have n = 5, t = 100, -o, and u = 10
-w"40%, 30%, 15%, 10%, 5%" would equate to 100% of the remaining 90%
Default: N/A
} . "\n";
getopts('hn:t:u:w:o', $opt) or die $Usage;
die $Usage if $opt->{h};
delete $opt->{w} if ! exists $opt->{o};
$opt->{n} = 5 if ! defined $opt->{n};
$opt->{t} = $opt->{n} * 10 if ! defined $opt->{t};
$opt->{u} = 0 if ! defined $opt->{u};
}
##
##
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark 'cmpthese';
my %dispatch = map {$_ => sub {my $res = "I found it"}} 1 .. ;
$dispatch{default} = sub {my $res = "I did not find it"};
my @find;
push @find, ;
cmpthese(-10, {
dispatch => sub {
for (@find) {
if (exists $dispatch{$_}) {
$dispatch{$_}->();
}
else {
$dispatch{default}->();
}
$dispatch{$_}->();
}
},
if_else => sub {
for (@find) {
if ($_ eq '1') {
my $res = "I found it";
}
elsif($_ eq '') {
my $res = "I found it";
}
else {
my $res = "I did not find it";
}
}
},
});