Re: -> Is Optional ?
by RichardK (Parson) on Dec 28, 2012 at 11:56 UTC
|
Arrow Rule
In between two subscripts, the arrow is optional.
| [reply] [d/l] |
|
|
| [reply] |
Re: -> Is Optional ?
by roboticus (Chancellor) on Dec 28, 2012 at 16:00 UTC
|
ree:
Just a bit of clarification on RichardK's answer: Notice how it says 'between' subscripts. So after the first one, it's always optional. Before the first one, though, you need to tell perl that you're accessing a value through a reference, and there are two ways you can do so. Either add a '$' to the front, or use a '->' after the scalar:
my @a = ( 1, 4, 9, 16); # squares
my @b = ( 1, 8, 27, 64); # cubes
my @c = ( \@a, \@b ); # two arrays
my $d = \@a;
my $e = \@c;
# OK: @a is an array
print $a[0];
# Wrong: $d is a reference, not an array!
print $d[0];
# OK: Both of these are fine, though
print $d->[0];
print $$d[0];
# with multiple subscripts:
print $e->[0]->[0];
print $e->[0][0]; # same as above, since -> is optional between sub
+scripts
print $$e[0][0]; # also same as above
You may find yourself preferring an extra '$' at the front (which is what I usually use) or using the '->' (which I use when I want to alert myself to the fact that I'm using a reference). You need to be comfortable with both, since you'll frequently encounter both notations.
Update: D'oh! I bungled my variable declarations, as caught by roho and explained by Athanasius. Corrected (converted square brackets to parenthesis in first three lines).
...roboticus
When your only tool is a hammer, all problems look like your thumb. | [reply] [d/l] |
|
|
Thanks for your sample code roboticus. I copied and ran it and discovered that an extra level of dereferencing is required. This was a good exercise in reference accessing. Below is your code with the modifications for the extra level of dereferencing. (Note: I commented out the line labeled "Wrong" so it would compile and run) Thanks again!
my @a = [ 1, 4, 9, 16]; # squares
my @b = [ 1, 8, 27, 64]; # cubes
my @c = [ \@a, \@b ]; # two arrays
my $d = \@a;
my $e = \@c;
# OK: @a is an array
print "Sample1: ", $a[0]->[0], "\n";
# Wrong: "Sample1: ", $d is a reference, not an array!
#print "Sample2: ", $d[0], "\n";
# OK: Both of these are fine, though
print "Sample3: ", $d->[0]->[0], "\n";
print "Sample4: ", $$d[0]->[0], "\n";
# with multiple subscripts:
print "Sample5: ", $e->[0]->[0]->[0]->[0], "\n";
print "Sample6: ", $e->[0][0][0][0], "\n"; # same as above, sin
+ce -> is optional between subscripts
print "Sample7: ", $$e[0][0][0][0], "\n"; # also same as above
"Its not how hard you work, its how much you get done."
| [reply] [d/l] |
|
|
my @a = [ 1, 4, 9, 16 ]; # squares
creates an anonymous array with 4 elements, and assigns a reference to this anonymous array — i.e., a single, scalar value — to be the first (and only) element of the named array @a.
I suspect that parentheses were intended rather than square brackets:
my @a = ( 1, 4, 9, 16 ); # squares
my @b = ( 1, 8, 27, 64 ); # cubes
my @c = ( \@a, \@b ); # two arrays
and then the rest of the original code behaves as intended.
Hope that helps,
| [reply] [d/l] [select] |
Re: -> Is Optional ?
by zentara (Cardinal) on Dec 28, 2012 at 11:51 UTC
|
See Fat Comma. You can use a comma instead.Oops, sorry ... I was informed by higher minds than me, that I misread the question and confused -> with =>. Mea Culpa Mea Culpa Mea Maxima Culpa. TGIF :-)
| [reply] |
Re: -> Is Optional ?
by Anonymous Monk on Dec 28, 2012 at 13:52 UTC
|
Perl is very forgiving. "There's more than one way to SAY it, too." But you probably should use use strict; use warnings; for this reason if none other: sometimes the interpretation taken isn't quite what you expected. | [reply] |
Re: -> Is Optional ?
by space_monk (Chaplain) on Dec 28, 2012 at 15:55 UTC
|
use strict;
use warnings;
As the previous poster said, if you haven't got these in your code, you are incredibly talented or incredibly stupid. As the original code is missing a brace in the variable declaration, I think we can guess which ..... :-)
A Monk aims to give answers to those who have none, and to learn from those who know more.
| [reply] [d/l] |
|
|
Your advice is a little off-point; while the posted code does contain a syntax error, this is a compilation error. Neither the addition of strict nor warnings would give any additional insight into the nature of the issue. Once you fix the curly issue, the code passes both tests just fine. I love these pragma dearly, but will never cite them in a response unless they actually help in the particular situation. Expecting people to include them above every code snippet, or expecting every code snippet to be a full script, is unnecessary orthodoxy.
You may also wish to peruse ree's profile to gather information about his familiarity with the language.
#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.
| [reply] |
|
|
| [reply] |
Re: -> Is Optional ?
by Anonymous Monk on Dec 28, 2012 at 22:26 UTC
|
| [reply] |