Может ли Perl-скрипт изменить себя?

Я хотел бы, чтобы мои сценарии отслеживали их последнюю дату пересмотра внутри как комментарий. Это возможно? Мне кажется, что нужно было бы получить дату, а затем открыть свой файл сценария для добавления, записать данные и сохранить файл.

Спасибо Everone, отличные ответы всех без исключения. Основанный на фрагменте кода, оставленном GreenMatt, я бросил это вместе...

#!/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.

7 ответов

Решение

Это возможно, но это не делает его хорошей идеей. Во-первых, он не будет обновлять дату, пока вы не запустите ее.

Если вы используете хороший редактор, у него может быть способ автоматически вставлять отметку времени при сохранении файла. Например, я настроил Emacs, чтобы сделать это в файлах HTML, используя write-contents-hooks, (Для работы с кодом на Perl потребуется некоторая модификация, но cjm-html-timestamp в cjm-misc.el даст вам отправную точку.)

Вы можете заставить свою систему контроля версий делать это автоматически.

Но если вы используете контроль версий, то этот шаг не совсем полезен.

По запросу добавляю мой комментарий в качестве ответа.

Похоже, вы уже знаете, как это сделать. Если это сценарий Perl в окне Unix/ Linux, то разрешения не должны быть проблемой, если он находится в окне Windows, он может не позволить вам, поскольку файл используется.

#! /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

Следующее работает в системе FreeBSD. Это добавляет к концу, что звучит приемлемо для вас, но не соответствует "нормальному" способу документирования изменений в файле - по крайней мере для меня, как я почти всегда видел, как это делалось в начале. Возможно, вы захотите изменить способ отображения даты / времени.

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

Мудро это или нет, я оставлю вам решать.

Очень старый вопрос, и это худшая практика. Если вы хотите знать, когда скрипт был запущен, внедрите любую систему ведения журнала для этого скрипта.

Если хотите узнать о модификациях, делайте так, как вам писали другие, с любой системой управления версиями, subversion или git (самая популярная, бесплатная для любого использования). Конечно, таким образом вы можете вручную написать журнал изменений с более крупными изменениями или ..... сделать этот журнал отдельно с другим расширением имени файла, например, <your_script>.changelog

Похоже, вы уже знаете, как это сделать. Если это сценарий perl в окне unix/linux, то права доступа не должны быть проблемой, если он находится в окне windows, он может не позволить вам, поскольку файл используется

Джон

Другие вопросы по тегам