The index expression of $array[ EXPR ] is evaluated in scalar context, and the an array in scalar context evaluates to the number of elements in the array.
my @folder = qw( a b c d e f );
my @name = qw( x y z );
my $var = $folder[@name]; # $var = 'd', since @name == 3.
| [reply] [d/l] [select] |
Thanks ikegami, for the wonderful explanation ! And I really appreciate the example. It really helps a lot.
And thanks for the other suggestions as well. I'm really glad I chanced upon this forum. I did thought of making use of print to try figuring out what the statements would do, but the Internet connection here is really awful. So I gave up downloading Strawberry Perl.
Only could resort to trying to understand the code using Notepad++.
| [reply] |
ikegami's post is technically correct.
However in the code that you presented, @name has nothing to do with @folder - this should be a "red flag"! Something is missing here!
This uses the number of items in @name as an index into the @folder array.
While this could happen, it would be unusual absent other context. I would be looking for some code that builds @folder based upon the elements in @name.
Update:
Furthermore, $var = $folder[@name]; would be unusual since Perl indicies are "zero-based". $var = $folder[@name-1]; would I think, be more expected - another "red-flag".
You may sometimes see $#name instead of @name-1, but this means the same thing - the last index.
| [reply] [d/l] [select] |
suppose you have @a= qw(1 2 3 4);
you are writting print "\n @a"; this will print 1 2 3 4.
if you are trying to write like...
$p= @a, then it will give you count of array i.e. 4
so it does not mean that if we write @a as index inside array would give the value of 4th index of array. Basically if we write code..
$b[@a] with return nothing because bare @a return complete set of value which is not a valid index and that is passing as index in @b so of course will return blank.
| [reply] [d/l] |
Perl syntax can be tricky. Does this help? Or just further confuse?
Update: I guess it confused one Monk, because I got a down vote.
I am genuinely trying to be helpful here.
When you write: $y[@x], you are accessing a single element of @y with the index of the scalar value of @x.
Note: using $a and $b or @a or @b is in general not a good idea as the $a and $b variables have special meaning to Perl and are used in sort. Better is to use: x,y,z.
However: "@a return complete set of value" this is not correct. What @a would mean is context specific.
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @x= qw(1 2 3 4);
my @y= qw(7 8 9 10 11 12 13 14);
my $num = $y[@x]; # @x evaluates here to the number "4"!!!
# the number of elements in @x
# As said before this is a VERY unusual
# formulation!!!
# It looks weird because it is weird.
# As mentioned above more normal would be
# $y[@x-1] or $y[$#x]
# I'm not saying that $y[@x] cannot have a defined,
# value but just that it is "strange" absent other
# context and would be worthy of a comment in the
# code.
print "The number in y is: $num\n"; #the 5th thing in @y!! WHOA!
#print $x[@y]; # ERROR: Use of uninitialized value in print
# this is because: $x[8] is undefined!
# However consider this:
# here [@x] means something completely different
push @y, [@x]; # this means: assign new memory,
# copy @x into that new memory ,
# push a reference to that memory
# onto @y
print Dumper \@y;
__END__
The number in y is: 11 ### the 5th thing in @y
$VAR1 = [
'7',
'8',
'9',
'10',
'11',
'12',
'13',
'14',
[
'1',
'2',
'3',
'4'
]
];
| [reply] [d/l] [select] |
Damien have a look at Arrays: A Tutorial/Reference. The relevant section is "Get count of elements" but it is well worth reading through.
Often you can find your answer by adding a print statement, taking ikegami's example:
print "@name";
# prints x y z
print @name;
# prints 3
| [reply] [d/l] |
print evaluates its operands in list context, so print @name; does not print 3. (print scalar(@name); and print 0+@name; do, though)
| [reply] [d/l] [select] |
Aagh - I did try it before I replied but like this:
print @name . "\n";
then I took the "\n" out to make it clearer (but didn't run it!). I take it the concatenation makes print evaluate in scalar context. So should be:
print "@name";
# prints x y z
print @name;
# prints xyz
print @name . "\n";
# prints 3
(lidden: I was still fixing this when you replied)
Update - then I found this:
If you believe in Lists in Scalar Context, Clap your Hands
I'll be back in a few weeks.
| [reply] [d/l] [select] |
use Data::Dumper;
....
print Dumper \@name;
Another module that you have to install before being able to use it:
use Data::Dump qw(pp);
.....
print pp \@name;
Basically, both of these modules can print/dump an arbitrary Perl data structure.
The format of the output is a bit different, but they both can do it.
This is actually pretty much magic.
It is of huge help when debugging.
And it is of very huge help once you get into multidimensional data structures. | [reply] [d/l] [select] |