2010-08-25 13 views
11

Me gustaría que mis scripts realicen un seguimiento de su última fecha de revisión internamente como un comentario. es posible? Me parece que necesitaría tomar la fecha y luego abrir su archivo de script para un apéndice, escribir los datos y guardar el archivo.¿Se puede modificar un script Perl?

Gracias Everone, great answsers one and all. Basado en el fragmento de código dejado por GreenMatt Tiré esto juntos ...

#!/usr/bin/perl -w 

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time; 
$year += 1900; 
$mon +=1; 

open SELF, ">> letterhome.pl" or die "Unable to open self"; 
#print SELF "# ran/modified at " . join(' ', localtime(time)) . "\n"; 
print SELF "# ran/modified at $hour:$min:$sec on $mon/$mday/$year.\n"; 
close(SELF); 

# ran/modified at 31 48 23 24 7 110 2 235 1 
# unformated result of using localtime(time) 

#Results using formated time/date 
# ran/modified at 0:1:43 on 8/25/2010. 
# ran/modified at 0:2:40 on 8/25/2010. 
# ran/modified at 0:4:35 on 8/25/2010. 
+2

Parece que ya sabes cómo hacerlo. Si se trata de un script de Perl en un cuadro Unix/Linux, los permisos no deberían ser un problema, si está en un cuadro de Windows, es posible que no lo permita, ya que el archivo está en uso. – John

+1

Los sistemas de archivos generalmente almacenan la última modificación de tiempo almacenada como metadatos. Si lo que hace el sistema operativo no es exactamente lo que quiere, puede modificar los metadatos, sin necesidad de almacenarlos dentro de un comentario en el código fuente. Eso funcionaría tanto en Windows como en Linux. –

+1

@John: amigo, si pones ese comentario exacto como respuesta, lo votaría y probablemente sería aceptado. –

Respuesta

6

Es posible, pero eso no significa que sea una buena idea. Por un lado, no actualizaría la fecha hasta que lo ejecutaste.

Si está utilizando un buen editor, puede tener una forma de insertar una marca de tiempo automáticamente cuando guarde el archivo. Por ejemplo, configuré Emacs para hacer eso en archivos HTML usando write-contents-hooks. (Se necesitaría alguna modificación para trabajar con código de Perl, pero cjm-html-timestamp en cjm-misc.el le daría un punto de partida.)

+0

¡Tiene toda la razón! Debería haberme dado cuenta de que antes de crear la publicación, eso me enseñará a publicar mientras corro una fiebre baja. Supongo que puede ser útil en determinadas circunstancias para rastrear la última fecha de ejecución dentro del script. Aunque un buen registro parece ser el método preferido.¡Gracias, aprecio la rapidez de tu respuesta! – jwhalen72

+0

'jwhalen72' podría no leer comentarios, pero' cjm' does :) – vol7ron

+0

Lol ... He leído los comentarios, grocking es otra cosa completamente;) por cierto ... su comentario suena como una referencia de "Chicks on Speed" .. . – jwhalen72

-1

suena como usted ya sabe cómo hacerlo. Si se trata de un script de Perl en una máquina Unix/Linux, los permisos no debería ser un problema, si es en una caja de ventanas que no se puede dejar que el archivo está en uso

- John

1

Lo siguiente funcionó en un sistema FreeBSD. Se agrega hasta el final, lo cual suena aceptable para usted, pero no se ajusta a la forma "normal" de documentar los cambios dentro de un archivo, al menos para mí, ya que casi siempre lo he visto hacerlo al principio. Es probable que desee cambiar la forma en que se muestra la fecha/hora.

#!/usr/bin/perl -w 
open SELF, ">> selfModify.pl" or die "Unable to open self"; 
print SELF "# ran/modified at " . join(' ', localtime()) . "\n"; 
close(SELF); 

Si esto es inteligente o no, lo dejaré para que usted decida.

+0

He añadido un poco para poner la marca de tiempo en un formato más legible ... no estoy seguro si esto tiene que ver con ejecutar Perl de fresa en mi PC con Windows o si es simplemente cómo funciona la función "tiempo local" (tiempo) ... – jwhalen72

+0

'localtime (time)' no tiene sentido 'localtime()' llama 'time' –

+0

@Brad Gilbert: Parece que tienes razón. Modifiqué la respuesta. – GreenMatt

7

Puede hacer que su sistema de control de versiones lo haga automáticamente.

Pero si está utilizando el control de versiones, este paso no es realmente necesario en primer lugar.

+2

Bueno, eso depende de tu VC. Git doesn ' t hacer expansión de palabras clave. (Bueno, puede, pero no es trivial configurarlo y no es recomendable). – cjm

3

Por solicitud agregando mi comentario como respuesta.

Parece que ya sabe cómo hacerlo. Si se trata de un script de Perl en un cuadro Unix/Linux, los permisos no deberían ser un problema, si está en un cuadro de Windows, es posible que no lo permita, ya que el archivo está en uso.

1
#! /usr/bin/env perl 
use warnings; 
use strict; 
use autodie; 

{ 
    open my $self, '>>', $0; 
    my $time = localtime; 
    print {$self} "# ran on $time\n"; 
} 

__END__ 
# ran on Wed Aug 25 16:41:05 2010 
+0

¡Qué bueno! Es interesante cómo la var cuando se imprime da un formato agradable "Wed Aug 25 16:41:05 2010" mientras que invocado directamente como en "print localtime;" produce "21411925711032361" – jwhalen72

+0

'localtime' no es una variable, es una subrutina. 'print escalar localtime' daría el mismo resultado. –

Cuestiones relacionadas