一度requireされたファイルをもう一度読み込む

| コメント(0) | トラックバック(0)
自動でファイルの書き換えをした場合とかに、最後に古いファイル・新しいファイルのチェックを行うために辿り着いた作戦。

新しい同名・同パッケージ名のファイルを別のディレクトから"require"すればOK。
同名のパッケージ名が新しく読み込んだパッケージで上書きされる。

ただし、useはコンパイル時に参照されるからだめかも知れない。
試してないけど。

---------------------------------------------------------------------------------------------

sub update_files_and_check{

 my $dir = '.'; ## 古いファイルが入ったディレクトリ
 ### 一度古いfile_list.plを読み込む
 require "$dir/file_list.pl";
 print "

現在あるファイルは、

\n";
 foreach(@file_list::req){
  print $_ ."
\n";
 }
 print "です。";

 my $dir = '.'; ## 古いファイルが入ったディレクトリ
 my $newdir = './newdir'; ## 新しいファイルが入ったディレクトリ(この中に新しいfile_list.plも入っている)


 ### ファイル書き換え

 opendir(NEW_DIR,$new_dir) || die "Can't open $new_dir !";
  while(my $doc = readdir(NEW_DIR)){
   if($doc !~ /^\.+$/){
    open(FILE,"$new_dir/$doc") || die "Can't open $new_dir/$doc !";
    my $buff = '';
    binmode FILE;
    while(){
     $buff .= $_;
    }
    close(FILE);
    if(-e "$dir/$doc"){
     unlink "$dir/$doc" || die "Can't delete $dir/$doc!";
    }
    open(FILE,">$dir/$doc") || die "Can't open $dir/$doc !";
    flock(FILE,2);
    print FILE $buff;
    flock(FILE,8);
    close(FILE);
   }
  }
 closedir();

 ### チェック&不要ファイル削除
 if(! eval "require $new_dir/file_list.pl;"){
 ## ↑ のrequireが成功すれば、この時点で変数「@file_list::xxx」が上書きされる
 ## "require $dir/file_list.pl;" にしてしまうと、最初にすでに読み込んでるので失敗する。

  print "新しいファイルが参照できません。";
  exit;
 }
 foreach(@file_list::req){
  if(!-e "$dir/$_"){
   print "$_が見つかりません!!";
   exit;
  }
 }
 foreach(@file_list::des){
  if(-e "$dir/$_"){
   unlink "$dir/$_" || die "$dir/$_が削除できません!";
  }
 }
}

---------------------------------------------------------------------------------------------


(書き換えられた新しいfile_list.pl)
------------------------------------------------------------------------------------
package file_list;

use strict;

### 今回必要なファイル
our @req = ( 'aaa.pl','bbb.pl','ccc.txt');

### 不要になったファイル
our @des = ('ddd.pl','eee.pl');

1;
------------------------------------------------------------------------------------

トラックバック(0)

トラックバックURL: http://www.igreks.jp/blog/mt-tb.cgi/378

コメントする