1

我是一个初学者 PERL 程序员,我遇到了一个我无法克服的障碍。我整天都在阅读和重新阅读 perl.org 上的网络帖子和 Simon Cozens 的书,但似乎无法解决问题。

我使用下面的代码的目的是遍历目录中的文件,当文件具有特定字符串时,使用名称来验证相同的文件名是否不存在具有不同的扩展名,如果不存在,则打印给我文件名(稍后我将实现文件的删除,但现在我想确保它能够正常工作。)具体来说,我正在查找 .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 文件之后返回“我会杀了……”。

我当前的代码如下。我感谢提供的任何帮助...

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

在循环文件时,我喜欢反复使用“下一个”语句来确保我只查看我想要的内容。试试这个:

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

虽然 stuart 的 anwser 使它更精简......我也能够让它与下面的代码一起工作......(我将 .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 回答