Página 1 de 1

[RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-08 13:05 @587
por Aceitunas
Bueno, pues el reto (que más que reto es curiosidad) consiste en hacer un programa que muestre su propio código fuente.

NOTA: El código más corto gana.

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-08 14:38 @651
por explorer
¿Vale usar módulos?

:D

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-08 14:40 @652
por Aceitunas
explorer escribiste:¿Vale usar módulos?

:D


Sí. :twisted:

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-08 16:27 @727
por explorer
Bueno, he encontrado dos soluciones. Dejaremos tiempo para que más gente participe.

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-09 12:59 @583
por Aceitunas
Yo tengo también un par de soluciones. :D

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-09 16:04 @711
por explorer
Bueno, la solución obvia es abrir el propio archivo, cuyo nombre está en $0, y luego imprimirlo por líneas... pero no es la única. Otras formas pueden ser la utilización de comandos externos (como cat), pero esa solución no es portátil.

Encontrar la solución más corta implica un conocimiento amplio de la sintaxis de Perl (y de alguna peculiaridad).

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-09 16:15 @718
por Aceitunas
Leyendo el archivo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open IN,$0;print<IN>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Usando truquillo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $_ = q{$_ = q{ACEITUNAS};s/ACEITUNAS/$_/;print;};s/ACEITUNAS/$_/;print;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-09 21:27 @936
por explorer
En efecto, esa es la idea.

Lo que sí podemos es aprovecharnos de una característica muy extraña, en el momento del open(), que es que si le pasamos un gestor de archivo que coincida con el nombre de una variable, abrirá el archivo cuyo nombre esté en esa variable. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. our $ARCHIVO = 'texto.txt';
  2. ...
  3. open ARCHIVO;   # abre 'texto.txt' en modo lectura
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Entonces, si $0 contiene el nombre del programa actual, podemos hacer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. open+0;print<0>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En cuanto a módulos, hay uno especializado en hacer esto: Quine. Su nombre viene de que precisamente se llaman así a los programas que hacen esa tarea.

Un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use Quine;
  3. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-10 06:23 @308
por Aceitunas
¡Ja, ja, ja! ¡Cómo me engancha Perl!

Sabía que esto se llamaba Quine, pero si lo ponía le quitaba gracia al asunto. :lol:

He estado mirando el módulo y también lee el archivo.

Re: [RETO-CURIOSIDAD] Imprime el código del programa

NotaPublicado: 2014-11-11 05:07 @255
por salva
El script más pequeño que saca por pantalla su código al ejecutarlo es el siguiente:



O sea, ¡¡¡un fichero vacío!!!