Re: foreach routine
- Posted by Derek Parnell <ddparnell at bigpond.com> Dec 22, 2006
- 672 views
duke normandin wrote: > > Coming from Perl, I'm trying to emulate the following: > > read(STDIN, $buffer, $ENV{CONTENT_LENGTH}); > @pairs = split(/&/, $buffer); > foreach $pair (@pairs){ > ($name, $value) = split(/=/, $pair); > blah > blah > } These might help ...
-- split.e --/func split_char(pDelim, pText) --/desc This will create subsequences of pText which is delimited by pDelim --/ret SEQUENCE: A set of subsequences. --This looks for the delimiter in pText and breaks it up into subsequences --at the delimiter boundaries. -- -- Example: --/code -- res = split_char('=', "age=59") -- -- Returns {"age", "59"} -- res = split_char(';', "abc;defg;hi;jkl;;qwerty") -- -- Returns {"abc","defg","hi","jkl","","qwerty"} --/endcode global function split_char(integer pDelim, sequence pText) sequence lResult integer lPos integer lNewPos lResult = {} lNewPos = 1 lPos = find(pDelim, pText) while lPos > 0 do lResult = append(lResult, pText[lNewPos..lPos-1]) lNewPos = find(pDelim, pText[lPos+1..$]) if lNewPos > 0 then lPos += lNewPos lNewPos = lPos - lNewPos + 1 else lNewPos = lPos+1 lPos = 0 end if end while lResult = append(lResult, pText[lNewPos..$]) return lResult end function --/func split(pDelim, pText) --/desc This will create nested subsequences of pText which is delimited by pDelim --/ret SEQUENCE: A set of nested subsequences. --/i(pDelim) is a set of one-character delimiters. /i(pText) is recursively -- split based on successive delimiters in /i(pDelim). -- -- Example: --/code -- res = split("&=", "dude=duke&age=59&style=kewl") -- -- Returns {{"dude","duke"}, {"age", "59"}, {"style", "kewl"}} --/endcode -- --However, if /i(pDelim) is either an integer or a single character sequence -- the result is equivalent to the split_char() function. -- --Example: --/code -- res = split('=', "age=59") -- -- Returns {"age", "59"} -- res = split(";", "abc;defg;hi;jkl;;qwerty") -- -- Returns {"abc","defg","hi","jkl","","qwerty"} --/endcode global function split(object pDelim, sequence pText) sequence lResult if integer(pDelim) then return split_char(pDelim, pText) end if lResult = split_char(pDelim[1], pText) if length(pDelim) > 1 then for i = 1 to length(lResult) do lResult[i] = split(pDelim[2..$], lResult[i]) end for end if return lResult end function --/func toKeyValue(pPairs) --/desc Converts the set of paired subsequences into two sequences of keys and values. --/ret SEQUENCE: A 2-element sequence. The first contains a list of keys, the 2nd a list of corresponding values. --The input is assumed to be a list of 2-element (pairs) sequences. The --output is just the pairs rearranged such that the first output subsequence -- is a list of all the keys, and the second output subsequences is -- a list of the corresponding values for those keys. -- --Example: --/code -- res = toKeyValue( {{"dude","duke"}, {"age", "59"}, {"style", "kewl"}} ) -- -- Returns ... -- -- { {"dude", "age", "style"}, {"duke", "59", "kewl"} } --/endcode global function toKeyValue(sequence pPairs) sequence lResult lResult = repeat( repeat({}, length(pPairs)), 2) for i = 1 to length(pPairs) do lResult[1][i] = pPairs[i][1] lResult[2][i] = pPairs[i][2] end for return lResult end function --/func findKeyValue(pKey, pKeyValues, pDefault) --/desc Returns the value associated with the /i(pKey) parameter. --/ret OBJECT: The associated value of the key. --The /i(pKeyValues) parameter must be a 2-element sequence, the --first containing keys and the second containing values for those keys. -- --This looks for the /i(pKey) value in the keys subsequence and when --found returns the corresponding value. If not found, it returns the --supplied /i(pDefault) value. -- --Example: --/code -- sequence x -- x = toKeyValue( split("&=", "dude=duke&age=59&style=kewl") ) -- ? findKeyValue("age", x, -1) -- returns "59" -- ? findKeyValue("dude", x, -1) -- returns "duke" -- ? findKeyValue("rabbit", x, -1) -- returns -1 -- ? findKeyValue("style", x, -1) -- returns "kewl" --/endcode global function findKeyValue(object pKey, sequence pKeyValues, object pDefault) integer lPos lPos = find(pKey, pKeyValues[1]) if lPos > 0 then return pKeyValues[2][lPos] else return pDefault end if end function
-- Derek Parnell Melbourne, Australia Skype name: derek.j.parnell