Loading ...
Sorry, an error occurred while loading the content.

Re: Reading partial array

Expand Messages
  • BhavinP
    well, my code was just to point in the right direction. a module that will give you chunks of 25 elements from the array each time its invoked. the last
    Message 1 of 10 , Sep 24, 2012
    • 0 Attachment
      well, my code was just to point in the right direction. a module that will give you chunks of 25 elements from the array each time its invoked. the last statement after we got the chunk is to move the array pointer 25 elements forward.

      ofcourse , we need to wrap it in a loop like map { print Dumper get25(); } (1..3) in one line would do it...


      --- In perl-beginner@yahoogroups.com, Joe Pepersack <joe@...> wrote:
      >
      > There are a couple problems with the solution provided by BhavinP, not
      > the least of which is that it doesn't duplicate Jana's requirements.
      > The subroutine is never invoked, and there is a completely useless
      > assignment after the slice.
      >
      > In Jana's example, there's no need to use threads or Switch, as the code
      > doesn't use those features. Don't use a module or feature that's never
      > invoked.
      >
      > The first part of your code is easy. Rather than using a for loop to
      > assign 0 to 99 to an array, we can use the range (..) operator:
      >
      > my @arr = (0..99);
      >
      > It's more compact and faster.
      >
      > The reason your code isn't working is that you're mis-using the range
      > operator in your array slice.
      > You have:
      > @temp = @arr[25*$k .. 25];
      >
      > You should have
      > @temp = @arr[ ($k*25) .. (($k*25)+24) ];
      >
      > When doing an array slice, you are telling it the values of the first
      > and second array indexes, not the first index and the number of values
      > you want. We also have to remember that array indexes are zero-based,
      > so we need to adjust accordingly to avoid off-by-one / fencepost
      > errors. Doing the math inline makes the code hard to read, so for clarity:
      >
      > my $incr = 25;
      > for my $k ( 0 .. 3 ) {
      > my $start = $incr * $k;
      > my $end = $start + ($incr - 1); # parens for clarity
      > my @temp = @arr[ $start .. $end ];
      > print "Array slice $start to $end is ( @temp )\n";
      > }
      >
      > This will give us:
      > Array slice 0 to 24 is ( ... )
      > Array slice 25 to 49 is ( ... )
      > Array slice 50 to 74 is ( ... )
      > Array slice 75 to 99 is ( ... )
      >
      > Printing the values of $start and $end allows us to easily debug the
      > code. If we had, for instance, said:
      > $end = $start + $incr;
      > it would be immediately obvious what the problem was.
      >
      > For style and additional clarity it's probably a good idea factor this
      > logic out into a function, but that's another lesson. You also
      > generally want to try to avoid using C-style for loops. Making your code
      > clear and readable should always be a priority.
      >
      > On 9/20/12 10:41 AM, BhavinP wrote:
      > >
      > >
      > >
      > > --- In perl-beginner@yahoogroups.com
      > > <mailto:perl-beginner%40yahoogroups.com>, "jana_van" <jana_van@> wrote:
      > > >
      > > > #!/usr/local/roadm/bin/perl
      > > > # This is compiled with threading support
      > > > use strict;
      > > > use warnings;
      > > > use threads;
      > > > use threads::shared;
      > > > use Switch;
      > > >
      > > > my @arr=();
      > > >
      > > > my $k=0;
      > > >
      > > > for($k=0;$k<100;$k++)
      > > > {
      > > > push(@arr, $k);
      > > > }
      > > >
      > > > print "\n The array is ", "@arr", "\n";
      > > > my @temp=();
      > > >
      > > > for($k=0; $k<4;$k++)
      > > > {
      > > > @temp = @arr[25*$k .. 25];
      > > > print "\n The fragmented array is ", "@temp", "\n";
      > > > @temp=();
      > > > }
      > > >
      > > > In the second for loop, for the first iteration @temp reading 25
      > > elements but for the second iteration onwards the values read by @temp
      > > are not as expected. whats the fault here ?
      > > >
      > > > My requirement is that @temp should print 25 elments of @arr for
      > > each iteration and the original array @arr should be intact. Please
      > > help here.
      > > >
      > > > Thanks
      > > >
      > >
      > > my @arr = (1..100);
      > > my $start = 0;
      > > my $end = 0;
      > > my $incr = 25;
      > >
      > > sub get25{
      > > $end = $start + $incr;
      > > my @retarr = @arr[$start..$end];
      > > $start = $end;
      > > return \@retarr;
      > >
      > > }
      > >
      > >
      >
      >
      >
      >
      > [Non-text portions of this message have been removed]
      >
    Your message has been successfully submitted and would be delivered to recipients shortly.