in reply to Array Reference

Thanks for all the responses. I appreciate the time you all took to provide an answer and the answers all pretty much confirm what I thought I already knew.

Here's an excerpt from the documentation on the CGI::param method: "...param returns a list of all of the values if it is called in a list context and just the first value if it is called in a scalar context.". So I wanted to avoid copying the contents of $q->param('at0') to another location and then passing a reference to that new array. I just wanted to pass a reference to the existing array. Hence my desire to use option 2) instead of 1). But using option 2) returns the following runtime error: "Can't use string ("H&C05.01") as an ARRAY ref...". Just to clear up the nature of the beast a few prints may be useful:

print Dumper($q->param('at0'))."\n"; # generates: $VAR1 = 'H&C05.01'; $VAR2 = 'SETT04.03';

print Dumper([$q->param('at0')])."\n"; # generates: $VAR1 = [ 'H&C05.01', 'SETT04.03' ];

print \@{$q->param('at0')}."\n"; # generates: Can't use string ("H&C05.01") as an ARRAY ref while "strict refs" in u +se at ...

So I'm probably being really dense here, but I still don't understand why I can't just generate a reference to the existing array instead of copying the contents of the array to another location and generating a reference to that new location. Is it because I'm working with a method instead of a property of the CGI object?

Still in the fog.

Replies are listed 'Best First'.
Re^2: Array Reference
by BrowserUk (Patriarch) on Feb 11, 2005 at 05:17 UTC
    Is it because I'm working with a method instead of a property of the CGI object?

    Yes. The param method decides to either give you a list (ie. copies of the values in the array it holds internally ) or just the first value (strange choice!) depending upon context. It doesn't provide a way of obtaining a reference to the internal array, so you cannot get at it--at least not through the 'front door' of the param method.

    However, this being Perl and all, if you use Dumper on the the CGI object itself, you see something like this:

    $VAR1 = bless( { 'at0' => [ '1', '2', '3' ], '.parameters' => [ 'at0' ], '.charset' => 'ISO-8859-1', '.fieldnames' => {}, 'escape' => 1 }, 'CGI' );

    So, if you're unconcerned with using the back door, then:

    #! perl -slw use strict; use Data::Dumper; use CGI; my $q = new CGI; my $at0ref = $q->{at0}; print $at0ref, " => @$at0ref"; __END__ P:\test>junk3 at0=1 at0=2 at0=3 ARRAY(0x195f6c4) => 1 2 3

    Caveat lector!


    Examine what is said, not who speaks.
    Silence betokens consent.
    Love the truth but pardon error.
      Well that does clear things up. In fact, I had been using the 'back door' but was looking for a clean way to use the 'front door'.

      Thanks for the insight.