http://qs321.pair.com?node_id=694420

in reply to Splicing Arrays on pre-defined indices

Here is something to try,
```my \$line = "1!2!3!4!5!6!7!8!9";
my @arr = split /!/, \$line;
my @indices = (2,5..8); #just remember indexing starts at 0.
print join(" : ", @arr);#original
print "\n";
print join(" : ", @arr[2,5..8]);#explicit
print "\n";
print join(" : ", @arr[@indices]);#predefined
Output
```1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9
3 : 6 : 7 : 8 : 9
3 : 6 : 7 : 8 : 9

Update
Just thought of another quick way to do this...
```my \$line = "1!2!3!4!5!6!7!8!9";
my @arr = split /!/, \$line;
my @exclude = (2,5..8); #just remember indexing starts at 0.

#set the elements to nothing and then filter them out.
@arr[@exclude] = ();
@arr = grep \$_, @arr;
Just another thought,

-InjunJoel
"I do not feel obliged to believe that the same God who endowed us with sense, reason and intellect has intended us to forego their use." -Galileo

Replies are listed 'Best First'.
Re^2: Splicing Arrays on pre-defined indices
by harishnuti (Beadle) on Jun 28, 2008 at 02:31 UTC
Thanks a lot for it.. but indeed the above is otherway meaning we are considering indices on what we want rather exclusion , but my requirement is we should exclude certain col by specifying indices( for ex: here @incides)..
```my \$line = "1!2!3!4!5!6!7!8!9"; # Original line read
my @arr = split /!/, \$line;
my @indices = (2,5..8); #i need these indices to be sliced
print join(" : ", @arr);#original
splice (@arr,@indices,1); # something like this iam trying to achieve
print "\n";
# i might be having 30 to 40 col of which i dont need 4 to 5, so its b
+etter i slice 4 to 5 col's instead of considering 30 col's
```my @exclude = (2,5..8);
my @exclude_lkup;
\$exclude_lkup[\$_] = 1 for @exclude;

my \$line = "1!2!3!4!5!6!7!8!9";
my @arr = split /!/, \$line;

my @filtered = map \$arr[\$_], grep !\$exclude_lkup[\$_], 0..\$#arr;
print("@filtered\n");  # 1 2 4 5
This is awesome, this is what iam looking for....Thx a lot.
Since I just updated my previous suggestion I figured I would Benchmark things...
Not that it matters but I thought you might be interested.
Update There was an issue with how I ran the test before. Here are the updated code and results.
```#!/usr/bin/perl -w
use strict;
use Benchmark;

my \$count = 500000;
my \$line = "1!2!3!4!5!6!7!8!9";
my @arr = split /!/, \$line;
my @exclude = (2,5..8);
my @exclude_lkup;
\$exclude_lkup[\$_] = 1 for @exclude;

sub ikegami
{
my @tarr = @arr;
my @filtered = map \$tarr[\$_], grep !\$exclude_lkup[\$_], 0..\$#tarr;
}

sub injun
{
my @tarr = @arr;
@tarr[@exclude] = ();
@tarr = grep \$_, @tarr;
}

timethese (
\$count,
{'Ikegami' => '&ikegami',
'InjunJoel' => '&injun'}
);
Results in
```Benchmark: timing 500000 iterations of Ikegami, InjunJoel...
Ikegami: 16 wallclock secs (15.88 usr + 0.00 sys = 15.88 CPU) @ 314
+94.08/s (n=500000)
InjunJoel: 10 wallclock secs ( 11.05 usr + 0.00 sys =  11.05 CPU) @ 4
+5265.25/s (n=500000)
Though I'm not versed enough in O(n) notation to tell you why...

-InjunJoel
"I do not feel obliged to believe that the same God who endowed us with sense, reason and intellect has intended us to forego their use." -Galileo
Re^2: Splicing Arrays on pre-defined indices
by harishnuti (Beadle) on Jul 09, 2008 at 09:19 UTC

Just an update on the question i asked earlier

actually iam stuck with the below in my project , so iam putting the following piece of code from my main script
```while (<process file delimited by ~ symbol>){
@data = split(/\~/,\$_); # will have around 30 elems
# \$data[23] will have user preference column selection
# user enters 3,3-7,4,9-13 etc anything he desires
\$data[23] =~ s/-/\.\./; # convert - to .. perl syntax
# 23rd elements contains the range entered by user
# for ex: 2,3-8,11-20
# i need to extract only above range ignoring rest
push(@range,eval \$array[23]); # i expanded here
@range = map { --\$_ } @range; # decrementing since array starts
+ from 0
# @range = grep { !\$seen{\$_}++ } @range; # remove duplicates in
+ case user enters like 2,1-10 etc
# @range = sort { \$a <=> \$b } @range; # Sort thee indices in as
+cending order like 1,2,3,4,5,6 and so on
my @finalarray = @data[@range];