2016-12-19 14:04 GMT+02:00 Jaren Peich <burkol...@gmail.com>:
> Hi,
>
> Sorry Risto i think i explained wrongly. Sorry for my english again.
>
> How can i access and retrieve the values declares in "Rule 1" (assign
> sentences)(ex. assign %priority (medium);) in the lcall block of code in
> "Rule 3"?
>
> One case:
> I want to print the value of %priority variable declared in "Rule 1" in
> "Rule 3"? The variable is created in "Rule 1" with assign sec sentence. How
> can i access?
>
> In "Rule 3":
> For example, in lcall block:
>       print "%priority";\-->Output: prints nothing or %priority. It doesn´t
> print the value assigned in "Rule 1".
>
> Also thank you for the explanation of lcall and eval.

...since in the case of 'lcall' the code has to be a function which is
compiled only once, you can not access match variables or action list
variables directly in the code. For example, the statement

print "%priority";

assumes that the %priority variable is substituted with a potentially
different value before each execution. Unfortunately, that would mean
that the code itself changes before execution, and therefore it would
have to be recompiled each time. However, since 'lcall' compiles the
code just once when the corresponding rule is loaded,
substitution-based approach can never work. For this reason, variable
substitution is *never* done inside the Perl code for the 'lcall'
action. Therefore, in the following statement
print "%priority"
"%priority" does not mean the action list variable inside double
quotes, but is rather interpreted by Perl itself. Since "%priority" is
just a string for Perl, the above print statement simply prints out
that string.

In order to allow to pass custom data to the code, it is done with via
function parameters (remember that 'lcall' only accepts a valid
function definition for the code). The 'lcall' action has the
following syntax (quote from the man page):

lcall %<var> [<paramlist>] -> <code>

<paramlist> is an optional list of input parameters which have to be
separated by whitespace. Inside the function, these parameters can be
accessed through $_[0] (first parameter), $_[1] (second  parameter),
$_[2] (third parameter), etc. special variables (these variables are
*not* sec variables, but standard variables of the Perl language).

For example, suppose you have the following rule definition:

type=single
ptype=substr
pattern=test
desc=test
action=add TEST abc; add TEST def; copy TEST %param1; \
       assign %param2 xyz zyx; \
       lcall %ret %param1 %param2 -> ( sub { print "First: ", $_[0],
"\n"; } ); \
       lcall %ret %param1 %param2 -> ( sub { print "Second: ", $_[1],
"\n"; } ); \
       lcall %ret %param2%param1 -> ( sub { print "Third: ", $_[0], "\n"; } )

In the action field, the 'copy' action sets %param1 variable to the
following string "abc<NEWLINE>def", while %param2 variable is set to
"xyz zyx".

The first invocation of 'lcall' will pass the following parameters to
the precompiled function
sub { print "First: ", $_[0], "\n"; }  :

1st parameter - "abc<NEWLINE>def"
2nd parameter -"xyz zyx"

Note that since newline and space character appear *within* the
parameter values, they are *not* considered separators between
parameters. Therefore, the function will print out the following data:

First: abc
def

The second invocation of 'lcall' will pass the same parameters to the
function it invokes, but since this time the second input parameter is
accessed in the function, the output is:

Second: xyz zyx

The third invocation of 'lcall' passes only one parameter to the
function it invokes, and this parameter is the concatenation of the
values of %param2 and %param1:

"xyz zyxabc<NEWLINE>def"

Note that these values are concatenated into a *single* parameter,
since there is no space between %param2 and %param1. (If the space
*would* be there, the parameters would be *swapped* -- the value of
%param2 would become the first parameter and %param1 the second inside
the function.)

For this reason, the third 'lcall' action will print out the following data:
Third: xyz zyxabc
def

Finally, you might ask the following question -- what value gets
assigned to the %ret action list variable which gets return values
from the functions? Since each successful 'print' statement returns 1,
the %ret variable will be set to 1 in all three cases (provided that
the functions didn't experience any issues with printing to standard
output).

I hope this e-mail helped to clarify how the parameters have to be
provided and how to access them inside the function. If you want to
refer to the entire parameter list, the @_ notation would have to be
used (the details are given in the "perlsub" documentation page).

hope this helps,
risto


>
> Regards. Thank for your help again.
>
> 2016-12-19 12:44 GMT+01:00 Risto Vaarandi <risto.vaara...@gmail.com>:
>>
>> > Which is the difference between eval and lcall?
>>
>> 'eval' will compile the code before *each* execution. This has the
>> advantage of using match variables and action list variables directly
>> in the code:
>>
>> action=assign %test mystring; eval %o ( print "%test", "\n" )
>>
>> For example, the above action list does the following:
>> 1) action list variable %test is set to mystring;
>> 2) the action list variable %test is substituted in the Perl code of
>> 'eval' action, yielding:
>> print "mystring", "\n"
>> 3) the code print "mystring", "\n" is compiled
>> 4) the compiled code is executed
>>
>> However, because of step 3 the 'eval' action is *very* expensive when
>> compared to 'lcall'. With 'lcall', the perl code is just compiled once
>> when SEC reads in rules from its configuration files, and all the
>> invocations of 'lcall' execute already compiled code. Therefore, I
>> would recommend to use 'eval' only when it is going to be executed few
>> times (e.g., for loading Perl modules at SEC startup).
>>
>> hope this helps,
>> risto
>
>

------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/intel
_______________________________________________
Simple-evcorr-users mailing list
Simple-evcorr-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users

Reply via email to