sub filter {
my $where = shift;
my @in = @_;
# This class method is used to filter an array of hashrefs against a set of criteria defined in $where.
# Example:
# @matching_hosts = filter( { site => 56, type => 4 }, @all_hosts);
# In this example, @matching_hosts will only contain those hashrefs that would return TRUE for the following code:
# ($_->{'site'} eq '56' && $_->{'type'} eq '4')
# Note that the "eq" and "&&" are implied; no other operators are supported.
# The order of the array is not affected.
my @out = ();
foreach my $record (@in) {
my $keep = 1;
foreach my $field (keys %{$where}) {
unless ($record->{$field} eq $where->{$field}) {
$keep = 0;
last;
}
push @out, $record if $keep;
}
}
return @out;
}
####
sub filter {
my $where = shift;
my @in = @_;
# This class method is used to filter an array of hashrefs against a set of criteria defined in $where.
# Example:
# @matching_hosts = filter( { site => 56, type => 4 }, @all_hosts);
# In this example, @matching_hosts will only contain those hashrefs that would return TRUE for the following code:
# ($_->{'site'} eq '56' && $_->{'type'} eq '4')
# Note that the "eq" and "&&" are implied; no other operators are supported.
# The order of the array is not affected.
my @out = ();
# Make one pass per match term
foreach my $field (keys %{$where}) {
my $value = $where->{$field};
@out = grep { $_->{$field} eq $value } @in;
@in = @out; # Prepare for next pass (if any)
}
return @out;
}
####
$ cat foreach_inner
#!/usr/bin/perl
use strict;
use warnings;
foreach my $foo (1 .. 3) {
foreach my $bar (1 .. 10000000) {
my $pointless = "$foo.$bar";
}
}
####
$ time ./foreach_inner
real 0m8.975s
user 0m8.954s
sys 0m0.013s
####
$ cat foreach_outer
#!/usr/bin/perl
use strict;
use warnings;
foreach my $foo (1 .. 10000000) {
foreach my $bar (1 .. 3) {
my $pointless = "$foo.$bar";
}
}
####
$ time ./foreach_outer
real 0m14.106s
user 0m14.092s
sys 0m0.003s