2011-07-26 13 views
0

このサイトのユーザーChrisによって提案されています。最初のperlスクリプトでは、値は辞書に保存されます。最初のスクリプトは正常です。最初のスクリプトは1回だけ実行され、値が保存されます。それは働いている。第二スクリプトでperlでのファイルの場所

私の$加工さ=( 'processed_dirs.dat')を取得します。 #$はハッシュリファレンスです

ここでは、最初のスクリプトにある "processed_durs.dat"が読み込まれています。ですから、私は2番目のスクリプトがProcessed_dirs.datの場所をここでどのように知っているのか疑問に思っています。

#!/usr/bin/perl 
use strict; 
use warnings; 
use Storable; 

# This script to be run 1 time only. Sets up 'processed' directories hash. 
# After this script is run, ready to run the daily script. 

my $dir = '.'; # or what ever directory the date-directories are stored in 

opendir my $dh, $dir or die "Opening failed for directory $dir $!"; 
my @dir = grep {-d && /^\d\d-\d\d-\d\d$/ && $_ le '11-04-21'} readdir $dh; 
closedir $dh or die "Unable to close $dir $!"; 

my %processed = map {$_ => 1} @dir; 

store \%processed, 'processed_dirs.dat'; 

第二スクリプト:

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::Copy; 
use Storable; 

my $dir = shift or die "Provide path on command line. $!"; 

my $processed = retrieve('processed_dirs.dat'); # $processed is a hashref 

opendir my $dh, $dir or die "Opening failed for directory $dir $!"; 
my @dir = grep {-d && /^\d\d-\d\d-\d\d$/ && !$processed->{$_} } readdir $dh; 
closedir $dh or die "Unable to close $dir $!"; 
@dir or die "Found no unprocessed date directories"; 

my $fdir = '/some/example/path'; 

for my $date (@dir) { 
    my $dday = "$dir/$date"; 
    my @gzfiles = glob("$dday/*tar.gz"); 

    foreach my $zf (@gzfiles) { 
     next if $zf =~ /BMP/ || $zf =~ /LG/ || $zf =~ /MAP/ || $zf =~ /STR/; 
     print "$zf\n"; 
     copy($zf, $fdir) or die "Unable to copy $zf to $fdir. $!"; 
    } 
    $processed->{ $date } = 1; 
} 
store $processed, 'processed_dirs.dat'; 
+0

私は質問を理解しませんが、原則としてファイル名やディレクトリ名を決してハードコードしないので、これが私のスクリプトであれば答えは明らかです。情報はコマンドラインにあります。 – reinierpost

答えて

1

私は何かが欠けていない限り、答えは次のとおりです。どちらのスクリプトは、それらが実行されているからどんなディレクトリに「processed_dirs.dat」と呼ばれるファイルを、使用しています。両方のスクリプトが同じディレクトリから実行されている限り、両方とも同じファイルを使用します。

+0

2番目に実際には、最初にデータファイルが格納されているディレクトリを識別するコマンドライン引数が必要です。 –

+0

@ジョナサン:そうですね。 2番目のスクリプトはコマンドライン引数を必要としますが、データファイル( 'processed_dirs.dat'としてハードコードされています)を開くためのパスの構築には使用しません。 –

+0

私は最初のスクリプトを自分で実行し、 processed_dirs.datでフォルダを受け取ったときと同じように(自動化)実行するには、このフォルダをチェックしてそれに応じて実行します。 – user847323