0

したがって、私のプログラムは再帰的にディレクトリを調べ、ディレクトリ内のファイルごとにファイルを開いて、「エラー」、「失敗」、「失敗」という単語を検索することになっています。次に、これらの単語が出現するインスタンスと、それらの単語の後の行の残りの文字を、コマンドプロンプトで指定されたファイルに書き出す必要があります。プログラムがディレクトリ内にあるファイルを検索するのに問題があります。現在、ディレクトリを再帰的に処理し、書き出すファイルを作成しますが、再帰で見つかったファイルを検索していないようです。これが私のコードです:

#!/usr/local/bin/perl

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


my $argument2 = $ARGV[0];
my $dir = "c:/program/Scripts/Directory1"; #directory to search through

open FILE, ">>$argument2" or die $!;   #file to write out 
my $unsuccessful = 0;
my @errors = ();
my @failures= ();
my @failures2 = ();
my @name = ();
my @file;
my $file;

my $filename;

opendir(DIR, $dir) or die $!;

while($file = readdir(DIR)){
next if($file =~ m/^\./);



foreach(0..$#file){
    print $_;
    open(FILELIST, '<', $_);    

    while(<FILELIST>){

    if (/Unsuccessful/i){
        $unsuccessful = 1;
    }
    if(/ERROR/ ){
        push(@errors, "ERROR in line $.\n");
        print  "\t\tERROR in line $.:$1\n" if (/Error\s+(.+)/);

    }
    if(/fail/i ){
        push(@failures, "ERROR in line $.\n");
        print FILE "ERROR in line $.:$1\n" if (/fail\s+(.+)/);

    }
    if(/failed/i ){
        push(@failures2, "ERROR in line $.\n");
        print FILE "ERROR in line $.:$1\n" if (/failed\s+(.+)/);

    }

    if ($unsuccessful){

    }

    }
    close FILELIST;


    }
}

closedir(DIR);
close FILE;

したがって、明確にするために、私の問題は、「while()」ループに含まれる検索が、ディレクトリで見つかったファイルに対して再帰的に実行されていないように見えることです。なぜこれが起こっているのかについてあなたが与えることができるコメント/提案/ヘルプは非常に役に立ちます。私はPerlを初めて使用するので、いくつかのサンプルコードは、あなたが何を言おうとしているのかを理解するのにも役立ちます。どうもありがとうございます。

4

2 に答える 2

4

通常、再帰ファイルで何かをしたいときは、find2perlから始めます。wanted-私がやりたいことを何でもするために変更できる機能を備えたボイラープレートを生成する印刷。

例えば

# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '.');
exit;
sub wanted {
    return unless -f $File::Find::name;
    return unless -R $File::Find::name;
    open (F,"<",$File::Find::name) or warn("Error opening $File::Find::name : $!\n");

    while(<F>) {
        if(m/error/) { print; }
        if(m/fail/) { print; }
    }   
}
于 2012-06-14T17:39:19.273 に答える
1

これは、再帰的なperlディレクトリリストの例です。実際には、おそらくfile :: findを使用するか、実際にはgrep -Rを使用しますが、これはある種の宿題であると想定しています。


use strict;

my $dir = $ARGV[0];
my $level = 0;

depthFirstDirectoryList($dir, $level);

sub depthFirstDirectoryList{
    my ($dir, $level) = @_;

    opendir (my $ind, $dir) or die "Can't open $dir for reading: $!\n";

    while(my $file = readdir($ind)){
        if(-d "$dir/$file" && $file ne "." && $file ne ".."){
            depthFirstDirectoryList("$dir/$file", $level + 1);
        }
        else{
            no warnings 'uninitialized';
            print "\t" x $level . "file: $dir/$file\n";
        }
    }

}


于 2012-06-14T17:44:28.100 に答える