自動でファイルの書き換えをした場合とかに、最後に古いファイル・新しいファイルのチェックを行うために辿り着いた作戦。
新しい同名・同パッケージ名のファイルを別のディレクトから"require"すればOK。
同名のパッケージ名が新しく読み込んだパッケージで上書きされる。
ただし、useはコンパイル時に参照されるからだめかも知れない。
試してないけど。
---------------------------------------------------------------------------------------------
sub update_files_and_check{
my $dir = '.'; ## 古いファイルが入ったディレクトリ
### 一度古いfile_list.plを読み込む
require "$dir/file_list.pl";
print "
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;
------------------------------------------------------------------------------------
新しい同名・同パッケージ名のファイルを別のディレクトから"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;
------------------------------------------------------------------------------------

コメントする