[perl] clasificacion

Salvador Ortiz Garcia sog@msg.com.mx
Mon, 16 Oct 2000 22:12:07 -0500 (CDT)


On Mon, 16 Oct 2000, Salman PSL wrote:

> Lo suponia, pero lo que no acabo de entender es como toma ese elemento
> 
> Si la expresion fuese $b =~ /(\d+)\|(\d+)\|(.*)/)[1]
> 
> si que entenderia que tomase el segundo grupo (\d+) pero no habiendo
> definidos mas elementos no entiendo la razon de ser del indice.

La razón de ser es por el contexto. 

Resulta que una expresión de 'match' en contexto escalar te devuelve un
valor booleano:

$ perl -e '$a = "hola"; $b = $a =~ /(ol)/; print $b'
1

No basta con ponerle parentesis al 'match' para cambiar el contexto pues
quien lo define en este caso es la asignación:

$ perl -e '$a = "hola"; $b = ($a =~ /(ol)/); print $b'
1

Pero si usas el subindice la cosa cambia, pues haces que el 'match' se
evalue en contexto de lista, en cuyo caso se devueven las subexpresiones:

$ perl -e '$a = "hola"; $b = ($a =~ /(ol)/)[0]; print $b'
ol

En este caso en particular, podrías forzar el contexto agregando
parentesis a la $b, pues estarías asignando a una lista!: 

$ perl -e '$a = "hola"; ($b) = $a =~ /(o)/; print $b'
ol

Pero en el caso del ejemplo que pusiste originalemente, el operador  <=>
imponía un contexto escalar y se requería el valor de las subexpresiones,
por eso el índice.

Nunca olvides que en perl, todo depende del contexto.


Saludos

Salvador Ortiz


--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text   : unsubscribe perl