1

Perl スクリプトを書いていますが、Perl は初めてです。ファイルのリストを含むファイルがあります。リストの各項目について、特定のディレクトリとそのサブディレクトリを検索して、ファイルが完全なパスを返すようにします。これまでのところ、File::Find を使用しようとして失敗しています。これが私が得たものです:

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

my $directory = '/home/directory/';
my $input_file = '/home/directory/file_list'; 
my @file_list;


find(\&wanted, $directory);

sub wanted {
    open (FILE, $input_file);

    foreach my $file (<FILE>) {
        chomp($file);

        push ( @file_list, $file );
    }   

    close (FILE);

    return @file_list;
}
4

3 に答える 3

2

File::Find::Rule の方が使いやすく、エレガントだと思います。

use File::Find::Rule;

my $path = '/some/path';
# Find all directories under $path
my @paths = File::Find::Rule->directory->in( $path );
# Find all files in $path
my @files = File::Find::Rule->file->in( $path );

配列には、File::Find::Rule が見つけたオブジェクトへの完全なパスが含まれています。

于 2012-11-08T21:11:15.980 に答える
0

さて、ドキュメントを読み直しましたが、wantedサブルーチンを誤解していました。はwanted、見つかったすべてのファイルとディレクトリで呼び出されるサブルーチンです。だからここにそれを考慮に入れるための私のコードがあります

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

my $directory = '/home/directory/';
my $input_file = '/home/directory/file_list';
my @file_list;

open (FILE, $input_file);

foreach my $file (<FILE>) {
    chomp($file);

    push ( @file_list, $file );
}   

close (FILE);

find(\&wanted, $directory);

sub wanted {
    if ( $_ ~~ @file_list ) { 
        print "$File::Find::name\n";
    }   
    return;
}
于 2012-11-08T19:52:14.263 に答える
0

File::Find は、ファイルシステム内のディレクトリ構造をトラバースするために使用されます。やろうとしていること、つまり必要なサブルーチンをファイルに読み込ませる代わりに、次のようにファイルを読み込む必要があります。

use strict;
use warnings;
use vars qw/@file_list/;

my $directory = '/home/directory/';
my $input_file = '/home/directory/file_list'; 
open FILE, "$input_file" or die "$!\n";
foreach my $file (<FILE>) {
    chomp($file);

    push ( @file_list, $file );
} 
# do what you need to here with the @file_list array
于 2012-11-08T18:54:06.873 に答える