My misunderstand!
Indeed it's the regular Rexx result. Because, before the instruction "say dati.attr.1.1.perc", "perc" is evaluated as a variable, now it exists, then the interpreter does the substitution with the value of "perc".
The corresponding variable "dati.attr.1.1.123" exists, caused by the initialization (dati. = ""), and is an empty string.
Without the "dati." initialization, the result is:

after initialization perc DATI.ATTR.1.1.123

and it's totally clear the mechanism of substitution.
I missed the effect of high level inizialization on stem variables.