Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 查找::文件以搜索文件列表的目录_Perl - Fatal编程技术网

Perl 查找::文件以搜索文件列表的目录

Perl 查找::文件以搜索文件列表的目录,perl,Perl,我正在编写一个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;

我正在编写一个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;
}
使用严格;
使用警告;
使用File::Find;
my$directory='/home/directory/';
我的$input_file='/home/directory/file_list';
我的@file_列表;
查找(\&wanted$directory);
通缉犯{
打开(文件,$input_文件);
foreach my$文件(){
chomp($file);
推送(@file_list,$file);
}   
关闭(文件);
返回@file\u列表;
}

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
使用严格;
使用警告;
使用vars qw/@file_list/;
my$directory='/home/directory/';
我的$input_file='/home/directory/file_list';
打开文件“$input\U FILE”或die“$!\n”;
foreach my$文件(){
chomp($file);
推送(@file_list,$file);
} 
#使用@file\u列表数组在此处执行所需操作

好的,我们重新阅读文档,我误解了
所需的子例程。所需的
是对找到的每个文件和目录调用的子例程。这是我的代码来考虑这一点

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;
}
使用严格;
使用警告;
使用File::Find;
my$directory='/home/directory/';
我的$input_file='/home/directory/file_list';
我的@file_列表;
打开(文件,$input_文件);
foreach my$文件(){
chomp($file);
推送(@file_list,$file);
}   
关闭(文件);
查找(\&wanted$directory);
通缉犯{
如果($\u~@file\u列表){
打印“$File::Find::name\n”;
}   
返回;
}

我发现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 finds的完整路径。

我相信
File::Find
需要
wanted
子例程。至少当我拉出数组并试图直接传递它时,我会得到:“no&want subroutine给定于/System/Library/Perl/5.12/File/Find.pm line 1291。”Steve,你应该编辑你的问题,而不是自己回答。@hd1,假设这解决了问题,op发布解决方案是完全正确的。编辑问题是为了解决效率低下的问题。将
push
行更改为
+$file\u列表{$file}
并将
~
行更改为
if($file\u list{$\u})
谢谢您对
规则的介绍,我会查看它。