2012-04-26 19 views
1

私は初心者のPERLプログラマーで、私が手に入れられない障害を見つけました。私は一日中perl.orgでWeb投稿とSimon Cozensの本を読んで再読していますが、問題を解決できないようです。perl - ディレクトリを通ってfile.mdbを見つけ、file.ldbが見つからない場合にコードを実行する

私が意図しているのは、ディレクトリ内のファイルをループスルーすることです。同じファイル名に異なる拡張子が存在しないことを確認するために、ファイルに特定の文字列がある場合は、 (後で私はファイルの削除を実装するが、今は確実に動作させたい)。特に、私は.mdbファイルを探していて、関連付けられた.ldbのファイルがないことを確認した後、 .mdbファイル。無関連する.ldbファイルと.MDBファイルの後に「...私は殺す」

RRED_Database_KHOVIS.ldb 
RRED_Database_KHOVIS.mdb 
I will kill RRED_Database_KHOVIS.mdb 

RRED_Database_mkuttler.mdb 
I will kill RRED_Database_mkuttler.mdb 

RRED_Database_SBreslow.ldb 
RRED_Database_SBreslow.mdb 
I will kill RRED_Database_SBreslow.mdb 

私はそれだけで返すようにしたい:

は今の私のコードは、この返されます。

私の現在のコードは以下の通りです。私は、ファイルをループするとき、私は唯一の私がしたい正確に何を見てることを保証するために繰り返し「次へ」ステートメントを使用したい...

use strict; 
use warnings; 
use File::Find; 
use diagnostics; 

my $dir = "//vfg1msfs01ab/vfgcfs01\$/Regulatory Reporting/Access Database/"; 
my $filename = "RRED_Database"; 
my $fullname, my $ext; 

opendir DH, $dir or die "Couldn't open the directory: $!"; 
while ($_ = readdir(DH)) { 
my $ext = ".mdb"; 
if ((/$filename/) && ($_ ne $filename . $ext)) { 
    print "$_ \n"; 
    unless (-e $dir . s/.mdb/.ldb/) { 
     s/.ldb/.mdb/; 
     print "I will kill $_ \n\n" ; 
     #unlink $_ or print "oops, couldn't delete $_: $!\n"; 
    } 
    s/.ldb/.mdb/; 
} 
} 

答えて

3

を提供する任意の助けに感謝します。このお試しください:スチュアートのanwserはそれをよりリーン作っている間

use strict; 
use warnings; 
use File::Find; 
use diagnostics; 

my $dir = "//vfg1msfs01ab/vfgcfs01\$/Regulatory Reporting/Access Database/"; 
my $filename = "RRED_Database"; 
my $fullname, my $ext; 

opendir DH, $dir or die "Couldn't open the directory: $!"; 
while ($_ = readdir(DH)) { 
    my $ext = ".mdb"; 

    # Jump to next while() iteration unless the file begins 
    # with $filename and ends with $ext, 
    # and capture the basename in $1 
    next unless $_ =~ m|($filename.*)$ext|; 

    # Jump to next while() iteration if if the file basename.ldb is found 
    next if -f $1 . ".ldb"; 

    # At this point, we have an mdb file with no matching ldb file 
    print "$_ \n"; 
    print "I will kill $_ \n\n" ; 
    #unlink $_ or print "oops, couldn't delete $_: $!\n"; 
} 
+0

ありがとうございます。私も答えを見つけました - あなたのコードはきれいに見えますが、下に掲載されています。あなたのコードに –

+0

を入れてみましょう "次のif -f $ 1。" .ldb ";という行に" $ 1 "の初期化されていない値を使用しています。あなたは$ 1変数にベース名を保存する方法ですが、私はこれを完全に理解していません...私は研究しますが、私は行方不明ですか? –

+0

私の答えはさらに7時間は投稿できません! ( –

0

を...私は今で取り扱っておりますので、(私はの.accdbする.MDBを変更...も、それは以下のコードで動作するように取得することができました別のファイルタイプ)

use strict; 
use warnings; 
use File::Spec; 
use diagnostics; 

my $dir = "//vfg1msfs01ab/vfgcfs01\$/Regulatory Reporting/Access Database/"; 
my $filename = "RRED_Database"; 
my $ext; 

opendir DH, $dir or die "Couldn't open the directory: $!"; 
while ($_ = readdir(DH)) { 
    my $ext = ".accdb"; 
    if ((/$filename/) && ($_ ne $filename . $ext) && ($_ !~ /.laccdb/)) { 
     # if file contains database name, is not the main database and is not a locked version of db 
     s/$ext/.laccdb/; 
     unless (-e File::Spec->join($dir,$_)) { 
      s/.laccdb/$ext/; 
      #print "I will kill $_ \n\n"; 
      unlink $_ or print "oops, couldn't delete $_: $!\n"; 
     } 
     s/.laccdb/$ext/; 
    } 
} 
関連する問題