Re: why can't I collapse reference variables?
[email protected] ("G. Wade Johnson") Sat, 28 Nov 2009 08:37:43 -0600
| Newsgroups | perl.scripts |
|---|---|
| Message-ID | <20091128083743.5e527d88@sovvan> |
Hello Mark, On Fri, 27 Nov 2009 19:48:09 -0800 (PST) Mark_Galeck <[email protected]> wrote: > Hello, the following question I posted on perl.beginners but for a few > days there is no response, so maybe it is not a beginners question? > Nah, it must be :) This question bounces on some subtleties in Perl's references and syntax. > -------------------------------- > If I can do this: > > $ref = \@foobar; > print @$ref; Yes. > then why can't I do this: > > print @\@foobar; This appears to be a syntax error, probably having to do with the @\@ not parsing as you expect. If you re-write it as print @{\@foobar}; is works as you probably intend. Unfortunately, I cannot imagine why you would want to do that. > ------------------------------------ > I have this kind of problem often, let me give another example, I > think it is similar, let me know if not. This is a completely different issue. > Why are all the printouts different: > > @foobar = (); > print \@foobar; #prints as reference to ARRAY As it should. > $foobar = \(); > print $foobar; # prints as reference to SCALAR Although many people misunderstand it, () does not create a list. The parens only provide grouping. In this case, you are taking a reference to a grouped nothing and perl is interpreting that as a request for a reference to an undef scalar. > print \(); #prints as array of references to SCALAR, in this case > empty array Correct. I would definitely suggest spending quality time with perlref and perlreftut. They will help you work through the syntactic oddities in references. There is a really good discussion of some of this at the Perl Monastery (http://perlmonks.org/?node_id=779217) Many people develop habits that reduce some of the confusion. I only derefence references in one of two ways (out of several). * If I need the whole item, I use the sigil and curlies. I never use just the derefencing sigil. @{$foo} not @$foo It reads better to me and is less prone to the kinds of syntax attack you had above. * If I need an element of a referenced array or hash, I use the arrow notation. $foo->{'a'} not ${$foo}{'a'} I find that the arrow helps me later in reading the code. The visual reminder of the reference simplifies my own code reading. I would definitely suggest you check out the Perl Monastery. It is a great community for helping with questions like this. G. Wade -- Against logic there is no armor like ignorance. -- Laurence J. Peter