NAME¶
PDL::IO::IDL -- I/O of IDL Save Files
DESCRIPTION¶
PDL::IO::IDL allows you to read and write IDL(tm) data files.
Currently, only reading is implemented. Scalars, arrays, and structures are all
supported. Heap pointers, compiled code, and objects are not supported. Of
those three, only heap pointers are likely to be supported in the future.
This code was not developed by RSI, makers of IDL.
NOTES¶
These things seem to work:
- BYTE, SHORT, LONG, FLOAT, and DOUBLE numeric types and arrays
- All of these types seem to work fine. The corresponding variable is stored
as a PDL in the hash element with the same name as the original variable
in the file. Arrays are byteswapped as needed and are read in so that the
dim list has the same indexing order within PDL as it did within IDL.
- STRINGs and arrays of STRINGs
- String types are stored as Perl list refs, in the hash element with the
same name as the original variable in the file.
- Structures
- Structures are stored as hash refs. The elements of the hash may be
accessed as values within the hash.
- Common blocks
- Variables that are notated as being in a common block are read as normal.
Common-block names are collected in the special hash value '+common',
which contains a hash each keyword of which is the name of a common block
and each value of which is an array of variable names.
These things are known to be not working and may one day be fixed:
- COMPLEX numbers
- These could be implemented as 2-arrays or as PDL::Complex values, but
aren't yet.
- PTR types
- These could be implemented as perl refs but currently aren't.
- writing
- Maybe one day -- but why bother writing a broken file format? NetCDF is
better.
These things are known to be not working and will probably never be fixed
- Compiled code
- Decompiling IDL code is a violation of the IDL end-user license. To
implement this, someone who does not hold an IDL license would have to
reverse-engineer a set of .SAV files sent to that person by someone else
with an IDL license.
- Objects
- IDL objects contain compiled code.
FUNCTIONS¶
ridl¶
$a = ridl("foo.sav");
Read an IDL save file from a file.
Upon successful completion, $a is a hash ref containing all of the variables
that are present in the save file, indexed by original variable name.
IDL identifiers are case insensitive; they're all converted to upper-case in the
hash that gets returned. This may be adjustable at a future date. Furthermore,
because IDL identifiers can't contain special characters, some fields that
start with '+' are used to store metadata about the file itself.
Numeric arrays are stored as PDLs, structures are stored as hashes, and string
and structure arrays are stored as perl lists. Named structure types don't
exist in perl in the same way that they do in IDL, so named structures are
described in the 'structs' field of the global metadata. Anonymous structures
are treated as simple hashes. Named structures are also simple hashes, but
they also contain a field '+name' that refers to the name of the structure
type.
AUTHOR, LICENSE, NO WARRANTY¶
THIS CODE IS PROVIDED WITH NO WARRANTY and may be distributed and/or modified
under the same terms as PDL itself.
This code is based on the analysis of the IDL save file format published by
Craig Markwardt in 2002.
IDL is a trademark of Research Systems Incorporated (RSI). The PDL development
team, and authors of this code, are not affiliated with RSI.