operator
source drop pattern
The drop operator returns the specified source with the data matched by the specified pattern consumed.
You can use the drop operator to perform substring operations:
process output "abcdef" drop any{3}
This program will output "def".
You can use drop with any OmniMark source and as part of a nested pattern matching operation. The following code uses drop to get the extra-path information in a CGI program:
do scan cgi-data{"PATH_INFO"} drop ~cgi-data{"SCRIPT_NAME"} match "/login" =| login-page match "/guess" =| guess-page else new-page done
Here the do scan is scanning the source returned by the drop operation. Note that drop returns a true source, so the unmatched data is not read by the drop operator. The data remains in the source until acted on by the action that uses the drop operator. This makes drop appropriate for use on large data sources.
It is an error if the pattern in a drop does not match. The following program includes an error in the data that causes the drop pattern not to match. This results in a program error, which is caught and processed by the program:
process local stream local-number using input as "My telephone number is (1234) 555-7890" repeat scan #current-input match any** lookahead "(" set local-number to #current-input drop ("(" digit{3} ")" white-space*) again output local-number catch #program-error code c do when c = 6131 output "Invalid number in data." else rethrow done
If you want to ensure that a take operation always succeeds, write your pattern so that it can match zero characters. In the following program, this is achieved by adding a "?" to the end of the drop pattern. Since any pattern with a ? or * occurrence indicator can match zero times, such a pattern will always match (though it may match zero characters):
process local stream local-number using input as "My telephone number is (1234) 555-7890" repeat scan #current-input match any** lookahead "(" set local-number to #current-input drop ("(" digit{3} ")" white-space*)? again output local-number
Since the data error still exists, the drop pattern will match zero characters and the drop operator will return its source with zero characters consumed. The program will therefore output "(1234) 555-7890".
Notice that the pattern used in a drop must be a simple pattern. If you need more than one pattern element in a drop, you must wrap the whole pattern in parentheses. Thus the take pattern in the code above is written ("(" digit{3} ")").