[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Old Timers ??
Eric Kihn wrote:
>
> Hello all,
>
> I've go some legacy code I'm trying to update and it looks like:
>
> ; Read text header from file
> ; until 'end header' reached.
> ;-----
> line = ''
> header = ''
> repeat begin
> readf, unit, line
> if (n_elements(header) eq 0) then $
> begin
> header = line
> endif else $
> begin
> header = [header,line]
> endelse
> endrep until (strtrim(line,2) eq 'end header')
>
> ;-----
> ; Close file.
> ;-----
> close, unit & free_lun, unit
>
> ;-----
> ;Get relevant info from the header.
> ;-----
> dda_header.file_id = $
> strtrim( get_keyword( header, 'file ID'), 2)
>
> This code is circa 95 and it's balking at the get_keyword() function. So my
> questions are two:
> 1) Did previous versions of IDL have a get_keyword() (I'm 5.3 now)?
> 2) It's clear this code is simulating a HASH with Arrays, does IDL 5.3 have
> native hash support of some kind?
1) No, but a search at
http://www.astro.washington.edu/deutsch/idl/htmlhelp/index.html reveals:
;+
; Project : SOHO - CDS
;
; Name : GET_KEYWORD
;
; Purpose : Extract values in a string array that appear after
; keyword construct such as: KEYWORD=VALUE
; (e.g. extract all time values following
STARTIME=time_value)
;
Could be from that, but then again, it might be something else
altogether.
2) No, sadly. The get_keyword routine probably does a linear search
through the header line array, looking for "file ID" in this case. This
is of course just the type of thing hashes were made for. The
get_keyword routine I found just uses "where", as you might expect.
This means not only is the search linear, all elements are considered,
even after a match is found. It could have been made more efficient in
IDL 5.4 if array_equal() had been implemented not just to return true as
soon as a match is found, but return the index of that match. Oh well.
Maybe an optional variable will be added to array_equal for this in
5.4.1. (hint)
It is possible to make a better simulation of a hash with a structure,
but that is somewhat inflexible since adding new keywords (fields) is
difficult, without copying the whole thing, though create_struct() can
do it. Then there is the matter of indexing the structure with a
variable field (the essence of what hashes do). Possible, but not
efficient... in fact nearly as inefficient as a "where" on the full
array. Unfortunately, it's not that easy to write a good hash type that
scales well for small and large hashes, and doesn't eat too much
memory.
JD
--
J.D. Smith | WORK: (607) 255-6263
Cornell Dept. of Astronomy | (607) 255-5842
304 Space Sciences Bldg. | FAX: (607) 255-5875
Ithaca, NY 14853 |