Example 1:
This is the same as is posted earlier in the discussion. This version is broken as the output is:my @arr = qw( and you will be pleased with the results ); # 0 0 1 0 1 0 1 1 my $mask = 0x2b; sub mask_array (\@$) { my( $arr, $mask ) = @_; my @want = split '', unpack( "b*", $mask ); return @{ $arr }[ grep { $want[ $_ ] } 0..$#{ $arr } ]; } my @result = mask_array @arr => $mask; foreach (@result) { printf("%s\n", $_); }
Example 2:
This code is the same as entered above in the discussion; its output is correct:my @arr = qw( and you will be pleased with the results ); # 0 0 1 0 1 0 1 1 my $mask = "\x2b"; my @new = do { my $i = 0; map { vec($mask, $#arr - $i++, 1) ? $_ : () +} @arr }; foreach (@new) { printf("%s\n", $_); }
Example 3:
The main code of this version is the same as Example 2 but I'm trying to work out how the bit map is supposed to work. This version breaks when there is more than 8 elements from which to select; its output is:@arr = qw( and you will be pleased with the results XX YY AA BB ); # \x2b 0 0 1 0 1 0 1 1 0 0 1 0 # \x2b20 0 0 1 0 0 0 1 0 1 0 1 1 $mask = "\x2b20"; @new = do { my $i = 0; map { vec($mask, $#arr - $i++, 1) ? $_ : () } @ +arr }; foreach (@new) { printf("%s\n", $_); }
I'm not flash on this bit manipulation and working with byte boundaries, etc... but these approaches look like they'd be useful with my current job: to be able to specify an arbitrary list of items to select from an arbitrarily long array.
Any further suggestions/explanations?
Thanks.
In reply to Re: Taking arbitrary elements from an array
by ozboomer
in thread Taking arbitrary elements from an array
by grinder
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |