On Sat, Feb 16, 2002 at 11:20:42AM -0500, Ian P. Thomas wrote:
>       If I read this correctly, I takes the first array from 
> unchecked_dfa_states and passes it out, but not before dereferencing 
> it.  I needed something that could take the first array as a whole 
> object and pass it to checked_dfa_states, another array of arrays.  
> After pouring through my Perl books, I think what I needed to do was to 
> give each stored array in unchecked_dfa_states a scalar reference.  
> This way I could pass the reference to the whole array.  Does that 
> sound right?   

It sounds like you have a fundamental misunderstanding about
multi-dimensional arrays in Perl.  A multi-dimensional array in Perl is just
an array of array references; these references are scalar values, and can be
passed around as single entities.

So the code:

    @checked_dfa_states = @{ shift(@unchecked_dfa_states) };

Removes the first element from @unchecked_dfa_states, dereferences it, then
assignes it to @checked_dfa_states.  So, given:

    @checked_dfa_states = ();
    @unchecked_dfa_states = (
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
    );

After the code I showed runs you'd have:

    @checked_dfa_states = (1, 2, 3);
    @unchecked_dfa_states = (
        [4, 5, 6],
        [7, 8, 9],
    );

If, instead, you wanted, as I suspect from your question, the result:

    @checked_dfa_states = (
        [1, 2, 3],
    );

    @unchecked_dfa_states = (
        [4, 5, 6],
        [7, 8, 9],
    );

Then don't dereference the shift; in other words, use:

    @checked_dfa_states = shift(@unchecked_dfa_states);


Does that answer your question?


>       The alternative that I used was keeping two arrays. One just 
> held information about  the size of the arrays in unchecked_dfa_states. 
>  I called it  unchecked_dfa_states_sizes.  I did a for loop using a 
> value from the unchecked_dfa_states_sizes array as the ceiling  to put 
> each element into a temporary array.  I then pushed this temporary 
> array onto checked_dfa_states.  The reason I was able to do this is 
> because I kept the two arrays, 
> 
> unchecked_dfa_states 
> unchecked_dfa_states_sizes  
>
> in sync.  That meant that every subscript for 
> unchecked_dfa_states_sizes matched a corresponding subscript for an 
> array in unchecked_dfa_states.  A reference to an array, and a separate 
> reference to its size.

Just to be clear, your two arrays would look something like this:

    @unchecked_dfa_states = (
        [1, 2, 3],
        [4, 5, 6, 7],
        [8, 9],
    );

    @unchecked_dfa_states_sizes = (
        3,
        4,
        2,
    );

where the size of $unchecked_dfa_states[$n] is in
$unchecked_dfa_states_sizes[$n].

This is unnecessary in Perl.  @{$unchecked_dfa_states[$n]} in scalar context
would yield the size of $unchecked_dfa_states[$n].


Instead of iterating over elements, like you describe, it's a fairly simple
matter to copy a dimension from @unchecked_dfa_states to
@checked_dfa_states:

    $checked_dfa_states[$n] = [ @{$unchecked_dfa_states[$n]} ]

This is much like the altered shift operation I showed you:

    @checked_dfa_states = shift(@unchecked_dfa_states);]

Except that it's not destructive of either @checked_dfa_states or
@unchecked_dfa_states.


 
> I believe you want: 
> 
> push( 
>                     @unchecked_dfa_states, 
>                     dfa_state_creation($unchecked_dfa_states[0], 
> $symbol) 
>                 ); 
>  
>       I can't remember exactly, but I believe when I tried to do it 
> this way, it passed an actual numeric value, the memory address to the 
> array referenced by $unchecked_dfa_states[0].  As above, I stored the 
> array referenced by $unchecked_dfa_states[0] into a temporary array and 
> passed that in like this 

The first argument to dfa_state_creation() call would be a reference.  In
numeric context this is a very large number.  However, this reference can be
dereferenced and used as if you were dealing directly with
$unchecked_dfa_states[0], because you actually are.

 
>       This worked.  Thanks for the help.  I think I need to spend 
> some more time with the animal books and reading this list.  I ended up 
> having some problems using global variables later in the program.  Next 
> time I'll cut and paste the code. :) 

Yes, reviewing the books is a very good idea.  You should also read perldoc
perlreftut and perldoc perlol.  The first is a tutorial on references, the
second documents how to use lists of lists, or multi-dimensional arrays.

There's also perldoc perlref and perldoc perldsc, describing references and
data structures, respectively.


Also, keep in mind that when multi-dimensional arrays are talked about in
Perl they're not quite the same thing as in other languages.  Some languages
are fixed in their dimensions: for instance, in C you can have a 3x2 array,
or 3x3x3, etc.  With Perl each of the elements of an array can be any
length: a prime example is from above:

    @unchecked_dfa_states = (
        [1, 2, 3],
        [4, 5, 6, 7],
        [8, 9],
    );

The toplevel array has 3 elements, but each sub-array has a variable number
of elements.  

I'm not sure if this matters in what you're doing, but it's something to
keep in mind in case it affects you.


I hope that helps a little more.  Good luck.


Michael
--
Administrator                      www.shoebox.net
Programmer, System Administrator   www.gallanttech.com
--

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to