Re: foreach routine

new topic     » goto parent     » topic index » view thread      » older message » newer message

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

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu