Re: [Cascavel-pm] usar constantes com operadores de expressão regulares

Eden eden em labbi.uesc.br
Quinta Janeiro 12 06:25:40 PST 2006


> Valeu Joenio... mas fiquei com uma dúvida ainda...
> Usar "@{}" desreferencia VAR (que é uma referência
> para uma função que retorna sempre o mesmo valor). Mas
> que diabos faz os colchetes nesse caso? Testei sem
> eles e não funcionou... :-(

'@{}' na verdade são duas operações, o '@' serve para de-referenciar o
símbolo ou referência que vier imediatamente após, e os colchetes são
simplesmente, um bloco de código. Se você escrever @VAR, o '@' vai
dereferenciar o glob '*VAR' como um array, e não é isso que você quer. Por
isso, existe a opção de se executar um bloco de código e dereferenciar o seu
valor de retorno, esse recurso é utilizado para resolver ambiguidades, como
foi no seu caso. Assim, '@{[VAR]}', vai executar a função VAR, construir um
array anônimo e retornar uma referência para esse array que vai ser
dereferenciado depois pelo '@'. Uma outra alternativa é usar o recurso de
match-time pattern interpolation (Camel Book, seção 5.10.3.4): (??{VAR}),
essa opção, porém, é bem mais lenta:

Benchmark: timing 200000 iterations of array_anonimo, interpolacao_codigo...
array_anonimo:  1 wallclock secs ( 0.62 usr +  0.00 sys =  0.62 CPU) @
322580.65/s (n=200000)
interpolacao_codigo:  7 wallclock secs ( 6.72 usr +  0.00 sys =  6.72 CPU) @
29761.90/s (n=200000)

Se o match falhar, é pior ainda:

Benchmark: timing 200000 iterations of array_anonimo, interpolacao_codigo...
array_anonimo:  1 wallclock secs ( 0.61 usr +  0.00 sys =  0.61 CPU) @
327868.85/s (n=200000)
interpolacao_codigo: 20 wallclock secs (19.64 usr +  0.00 sys = 19.64 CPU) @
10183.30/s (n=200000)


Mais detalhes sobre a lista de discussão Cascavel-pm