Home
Search Perl pages
Subjects
By activity
Professions, Sciences, Humanities, Business, ...
User Interface
Text-based, GUI, Audio, Video, Keyboards, Mouse, Images,...
Text Strings
Conversions, tests, processing, manipulation,...
Math
Integer, Floating point, Matrix, Statistics, Boolean, ...
Processing
Algorithms, Memory, Process control, Debugging, ...
Stored Data
Data storage, Integrity, Encryption, Compression, ...
Communications
Networks, protocols, Interprocess, Remote, Client Server, ...
Hard World Timing, Calendar and Clock, Audio, Video, Printer, Controls...
File System
Management, Filtering, File & Directory access, Viewers, ...
|
|
|
The most important thing to understand about all data structures in Perl --
including multidimensional arrays--is that even though they might appear
otherwise, Perl @ARRAY s and %HASH es are all internally one-dimensional. They can hold only scalar values
(meaning a string, number, or a reference). They cannot directly contain
other arrays or hashes, but instead contain references to other arrays or hashes.
You can't use a reference to a array or hash in quite the same way that you would a real array or hash. For
C or
C++ programmers unused to distinguishing between arrays and pointers to the same, this can be confusing. If so, just think of it as the difference between a structure and a pointer to a structure.
You can (and should) read more about references in the
perlref(1) man page. Briefly, references are rather like
pointers that know what they point to. (Objects are also a kind of
reference, but we won't be needing them right away--if ever.) This means
that when you have something which looks to you like an access to a
two-or-more-dimensional array and/or hash, what's really going on is that
the base type is merely a one-dimensional entity that contains references
to the next level. It's just that you can use it as though it were a two-dimensional one. This is actually the way almost all
C multidimensional arrays work as well.
$list[7][12] # array of arrays
$list[7]{string} # array of hashes
$hash{string}[7] # hash of arrays
$hash{string}{'another string'} # hash of hashes
Now, because the top level contains only references, if you try to print
out your array in with a simple print() function, you'll get
something that doesn't look very nice, like this:
@LoL = ( [2, 3], [4, 5, 7], [0] );
print $LoL[1][2];
7
print @LoL;
ARRAY(0x83c38)ARRAY(0x8b194)ARRAY(0x8b1d0)
That's because Perl doesn't (ever) implicitly dereference your variables.
If you want to get at the thing a reference is referring to, then you have
to do this yourself using either prefix typing indicators, like
${$blah} , @{$blah} , @{$blah[$i]} , or else postfix pointer arrows, like $a->[3] , $h->{fred} , or even $ob->method()->[3] .
Source: Perl Data Structures Cookbook Copyright: Larry Wall, et al. |
Next: COMMON MISTAKES
Previous: more elaborate constructs
(Corrections, notes, and links courtesy of RocketAware.com)
Up to: Data structures (In memory)
Rapid-Links:
Search | About | Comments | Submit Path: RocketAware > Perl >
perldsc/REFERENCES.htm
RocketAware.com is a service of Mib Software Copyright 2000, Forrest J. Cavalier III. All Rights Reserved. We welcome submissions and comments
|