Perl no es C, es Perl :-) (Era Re: [P]perl en una linea)

Ernesto Hernandez-Novich emhn at telcel.net.ve
Tue Nov 27 10:15:44 CST 2001


On Tue, 27 Nov 2001, Jose Luis Zabalza wrote:
> El Mar 27 Nov 2001 14:54, Larry Alexander Nieves escribió:
> > >
> > > perl -ne 'print "$ARGV\n",$X=$ARGV if $X ne $ARGV;/MiFuncion\((.*)\)/g
> > > and print "($1)\n"' *.cpp
> > >
> > > Pregunta :
> > >
> > > 	¿ Porque me imprime dos veces el nombre del fichero ?
> >
> > Porque tu se lo estás pidiendo explicitamente, con
> > 	'print "$ARGV\n"'
> >
> > Lee perlvar(1)
>
> Ya lo he leido, ya se porque es. Lo que yo quiero es

En beneficio de los demás, se debe a un inadvertido uso del operador
coma (vicio adquirido de los programadores C :-).

print(A,B) indica "A y B son argumentos para la función print()"
print A,B  indica "la expresión A,B es argumento para la función print()"

Y son cosas _muy_ diferentes.

> perl -ne '(print "$ARGV\n"),$X=$ARGV if $X ne $ARGV;/MiFuncion\((.*)\)/g and
> print "($1)\n"' *.cpp

Ese cortocircuitaje es un "C-ismo", considerando que en Perl se puede
"imprimir lo que se hace" me gusta más

perl -ne 'BEGIN { $\ = "\n" } print $x = $ARGV if $x ne $ARGV;
          /MiFuncion\((.*)\)/g and print "($1)"' *.cpp

print $x = $ARGV es, en efecto, imprimir el resultado de la asignación,
que solamente se efectúa si $x ne $ARGV. Por otro lado, separar el "\n"
del print deja claro lo que se quiere imprimir, poniendo lo cosmético
en manos de $\.

Y este es más rápido y compacto, a costo de memoria (tanta como el
archivo más grande que estés procesando).

perl -0777ne 'BEGIN { $\ = "\n" } print $ARGV;
              print "($1)" while /MiFuncion\((.*)\)/g' *.cpp

- Sin cortocircuitajes.
- Sin variables globales para saber dónde estoy parado.
- Usando //g como se concibió, en contexto de lista para que suministre
  todos los valores a un while() y los imprima uno por uno.

Piensa en Perl, no en C (se dice fácil ;-).

TMTOWTDI
-- 
Ernesto Hernández-Novich - Running Linux 2.4.16 i686 - Unix: Live free or die!
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/E d+(++) s+: a C+++$ UBLAVHIOSC*+++++$ P++++$ L+++$ E--- W+ N++ o K+++ w--
O- M- V- PS+ PE Y+ PGP>++ t+ 5- X+ R* tv+ b++ DI+++$ D++ G++ e++>+++ h r% y+
-----END GEEK CODE BLOCK-----

------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list