1

私は初心者のPERLプログラマーですが、手に負えない問題に遭遇しました。私はperl.orgでウェブ投稿とSimonCozensの本を一日中読んだり読み直したりしていますが、問題を解決できないようです。

以下のコードでの私の意図は、ディレクトリ内のファイルをループし、ファイルに特定の文字列がある場合、同じファイル名が別の拡張子で存在しないことを確認し、存在しない場合は、ファイル名(後でファイルの削除を実装しますが、今のところは確実に機能するようにします。)具体的には、.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

.ldbファイルが関連付けられていない.mdbファイルの後に「Iwillkill...」のみを返すようにします。

私の現在のコードは以下の通りです。私は提供された助けに感謝します...

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/;
}   
}
4

2 に答える 2

3

ファイルをループするときは、「next」ステートメントを繰り返し使用して、必要なものだけを表示していることを確認します。これを試して:

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";
}
于 2012-04-26T20:30:34.187 に答える
0

スチュアートの答えはそれをよりスリムにしました...私はそれを以下のコードで動作させることもできました...(私は今別のファイルタイプを扱っているので.mdbを.accdbに変更しました)

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/;
    }   
}
于 2012-05-01T21:00:48.267 に答える