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