Siechfred: Arrays mit "grep" filtern

Beitrag lesen

Und ... wer keine RegExes mag kommt mit folgender Form besser zurecht:

Und wer's performant mag, nimmt einen Hash-Slice:

my @array1 = (1..10);  
my %wanted;  
@wanted{(6..10} = ();  
@array1 = grep { exists $wanted{$_} } @array1;

Diese Variante ist bei mir mehr als 7mal so schnell wie die foreach-Variante. Zum Selbertesten:

use strict;  
use Benchmark;  
  
my @array1 = (1..10);  
  
Benchmark::cmpthese(-1, {  
    'foreach_grep'  =>  sub { my @wanted = (6..10);;  
                              foreach my $exclude (@wanted) {  
                                @array1 = grep { $_ ne $exclude } @array1;  
                              }  
                            },  
    'slice_grep'    =>  sub { my %wanted;  
                              @wanted{(6..10)} = ();  
                              @array1 = grep { exists $wanted{$_} } @array1;  
                            },  
});

Ergibt bei mir:

                Rate   foreach_grep   slice_grep  
foreach_grep  6775/s             --         -89%  
slice_grep   58964/s           770%           --

Siechfred

--
Coping With Scoping (Deutsche Übersetzung)
Als Moderator habe ich keinerlei Humor, von dem ich wüsste.