Path: utzoo!attcan!uunet!snorkelwacker!apple!amdahl!ntmtv!hildum From: hildum@ntmtv.UUCP (Eric Hildum) Newsgroups: comp.lang.icon Subject: What is the best way to do this? Keywords: scanning, string Message-ID: <1214@ntmtv.UUCP> Date: 6 Jun 90 23:37:07 GMT Reply-To: hildum@alpet.UUCP (Eric Hildum) Organization: Northern Telecom (Mountain View, CA) Lines: 46 I am writing a procedure which scans a file for the objects that it includes, and returns the name of the object. Objects are included via a line of the form: *=> [chars]* COPY name where name is the name of the object, COPY is a keyword, *=> marks the beginning of the line, and [chars]* are any characters but the sequence COPY. White space is ignored, and there are a random number of them on a line. I have written the following procedure to open the files and generate the names of objects included in the file. The commented out portion is a previous version of the loop body, and I have created a new loop body using an if expression. Which one of these is better, and why? If there is a better solution, I would like to see it. Thank you, Eric Hildum procedure find_segments(name) local msource_file static segment_chars initial segment_chars := &ucase ++ &lcase ++ '0123456789' (msource_file := open(name, "r")) | stop("Unable to open: " || name) while line := read(msource_file) do #new line ? if (match("*=>") & tab(find("COPY") + 4)) then { tab(upto(segment_chars)) suspend tab(many(segment_chars)) \ 1 } #old # suspend( line ? (match("*=>"), # tab(find("COPY") + 4) , # tab(upto(segment_chars)) , # tab(many(segment_chars))) ) \ 1 close(msource_file) end