hi Bond, is my understanding correct that you would like to match a one-line comma separated list of strings and generate a separate synthetic event for each list element? In other words, if the input is
aaa,bbb,ccc,ddd your action should produce the following four events: aaa bbb ccc ddd The above problem can be addressed in a much simpler way, and here is an example which does that with just two actions: type=Single ptype=regexp pattern=list: (.+) desc=take a comma separated list and generate events for list elements action=lcall %events $1 -> ( sub { split(/,/, $_[0]) } ); \ event %events The 'lcall' action will split the input string into parts by comma, and the elements will be returned not as a scalar, but rather as a list. When a list value is returned from 'lcall', it is stored as a multiline string into %events variable. After that, the 'event' action is invoked for the %events variable. However, when 'event' action is applied against multiline string, it generates a separate synthetic event for each line in the string. The SEC 'while' and 'if' actions are handy for a number of advanced tasks (e.g., looping over context event stores, sending multiple udp packets to remote destinations, etc.) , but here you don't really need them, since everything can be handled with simpler actions in a much shorter way. Also, apart from the 'event' action, the SEC context actions have a similar support for multiline strings (please see the official docs for more detailed information). kind regards, risto 2015-10-05 6:52 GMT+03:00 Bond Masuda <bond.mas...@jlbond.com>: > I need to process a comma delimited list and generate an internal event > for each item. Below is what i have for my action list, but I don't know > if this is the best way to accomplish what I'm doing: > > > > action= assign %list $1; \ > assign %i 0; \ > assign %have_item 1; \ > while %have_item ( \ > eval %list_item ( \ > my $i = %i; \ > my @list = split(/,/,"%list"); \ > return $list[$i]; \ > ); \ > event 0 PROCESS_ITEM %list_item; \ > eval %i ( my $i = %i; return $i++; ); \ > eval %have_item ( \ > my $i = %i; \ > my @list = split(/,/,"%list"); \ > if( $i < scalar(@list) ){ \ > return 1; \ > }else{ \ > return 0; \ > } \ > ); \ > ) > > The interaction between my loop control variables in the SEC context > versus in the perl mini-programs in 'eval' seem cumbersome. Is there a > better way to do this? > > Also, is it correct to initialize my while loop control %have_item > before starting the while loop? Or is that not necessary? There is an > assumption here that $1 is not an empty list, and that should be ok as > there is a check before this rule and this rule will not trigger unless > the list is not empty. > > Thanks, > Bond > > > > ------------------------------------------------------------------------------ > _______________________________________________ > Simple-evcorr-users mailing list > Simple-evcorr-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users >
------------------------------------------------------------------------------
_______________________________________________ Simple-evcorr-users mailing list Simple-evcorr-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users