The whole point of using references was so that I didn't want to keep 
copying array slices.  This script will be handling nearly 1500 program 
source files totalling almost 750k lines of code.  

Any further help would be appreciated.

Gary

On Tuesday 15 May 2001  5:32 pm, Jos Boumans wrote:
> Ok, let's hope i can shed some light on this situation.
>
> What's going wrong is that you are using a reference to an array
> slice... not sure why that's a big problem but it is apparently.
> in your case, there are 2 solutions:
>
> 1) do something like the following if you insist on using references
>
>     @foo = (1,2,3,4,5,6,7,8,9);
>     @baz = @foo[1..5];
>     bar(\@baz);
>
>     sub bar {
>         my $aref = shift;
>         for (@$aref) {print}
>     }
>
>     #which will nicely print '23456'
>
> 2) Seeing your passing an array slice to the sub, there is no real
> need for references, so you could do something like this:
>       @foo = (1,2,3,4,5,6,7,8,9);
>        bar(@foo[1..5]);
>
>     sub bar {
>          my @a = @_;
>          for (@a) {print}
>     }
>
>      #which will nicely print '23456'
>
> I hope this will solve your problem for now...
>
> Regards,
>
> Jos Boumans
>
> Paul wrote:
> > --- Gary Stainburn <[EMAIL PROTECTED]> wrote:
> > > Hi all,
> >
> > Hi, Gary. =o)
> >
> > > I have an array that holds the source code to a cobol program.  I
> > > then have a number of integers that hold the subscript for
> > > section
> >
> > and
> >
> > > division changes.
> > > I then have subs that parse sections of that array. e.g. a sub
> > > called file_control will parse the file-control section and
> > > extract information from the file select statements.
> >
> > Actually, that sounds like a pretty cool arrangement.
> >
> > > At the moment my code works because I store the array as a global
> > > variable and pass to the sub the start and end array elements.
> >
> > Ah. A reasonable way to deal with the circumstance, but globals are
> > commonly considered "bad", lol....
> >
> > > I want to now make my code a bit more flexible and simply pass a
> > > reference to the section I require.  The code I've tried may give
> > > a better idea of what i mean.  when I run my code I get the
> > > following error on the 'foreach (@$lines)' line
> > >
> > > Not an ARRAY reference at ./s line 109.
> >
> > Hmm....looking below, the cause is not immediately apparent to me.
> > In fact, what you've done was the first solution that popped into
> > my mind. (Somebody please explain the problem with that for me,
> > too?)
> >
> > > I could simply pass the array sections to the subroutines but
> > > that would be very inefficient - the procedure divisions of some
> > > the programs are 5k lines - hence the attempt to reference.
> >
> > I think this is a good candidate for an object.
> > Try this:
> >
> >   my $obj = {};
> >   $obj->{CODE} = [ @lines ];
> >
> > now you can undef @lines to recoup that memory (though Perl
> > probably won't give it back.....)
> >
> > Then you can do neat things like putting the section indexes on the
> > object also:
> >
> >   $obj->{FILECTL} = $fc_ndx;
> >
> > Then all you have to do is pass the object to each function.
> >   file_control($obj);
> >
> > and they can grab the pieces they need off it.
> >
> >  sub func {
> >      my $obj = shift;
> >      for my $ndx ($obj->{SECTION1} .. ($obj->{SECTION2}-1)) {
> >          # code for section
> >      }
> >  }
> >
> > try looking at the perldocs for
> >     perlref
> >     perlreftut
> >     perlobj
> >     perlboot
> >     perltoot
> >     perltootc
> >
> > Paul
> >
> > (Original code left below for reader's convenience)
> >
> > > my @lines=( # simulate read cobol file
> > > ........
> > > "       file-control.\r\n",
> > > "           select jobfile\r\n",
> > > "               assign external das1\r\n",
> > > "               organization is indexed\r\n",
> > > "               access dynamic\r\n",
> > > "               record key is job-jf-key\r\n",
> > > "               file status is w01-jobf-stat\r\n",
> > > "               lock mode is automatic with rollback.\r\n",
> > > .......
> > >
> > > &file_control(\@lines[10..36]); # pass pointer to array elements
> > > 10-36
> > >
> > > sub file_control() {
> > >   my ($lines)=@_;
> > >   foreach (@$lines) {   # process each line in array section
> > >     next if (/^      [\/\*]/);
> > > ........
> >
> > __________________________________________________
> > Do You Yahoo!?
> > Yahoo! Auctions - buy the things you want at great prices
> > http://auctions.yahoo.com/

-- 
Gary Stainburn
 
This email does not contain private or confidential material as it
may be snooped on by interested government parties for unknown
and undisclosed purposes - Regulation of Investigatory Powers Act, 2000 
    

Reply via email to