Perl:在目录中查找文件并将其分配给变量

时间:2012-08-07 13:35:48

标签: perl file directory user-input

我正在尝试开发一个perl脚本,该脚本通过用户目录的全部查找特定文件名,而无需用户指定文件的完整路径名。

例如,假设感兴趣的文件是focus.qseq。它位于/home/path/directory/。在命令行中,通常用户必须指定文件的路径名,以便访问它,如下所示:/home/path/directory/focus.qseq

相反,我希望用户只需在命令行中输入sample.qseq,然后perl脚本会自动将正确的文件分配给变量。如果文件是重复文件但在单独的目录中,则终端将显示这些文件的完整路径名,用户可以更好地指定它们所指的文件。

我读到了File::Find模块,但它并没有完全符合我的要求。

这是我实现上述代码的最佳尝试:

#!/usr/bin/perl
use strict; use warnings;
use File::Find;

my $file = shift;

# I want to search from the top down (you know, recursively) so first I look in the home directory
# I believe $ENV{HOME} is the same as $~/home/user
find(\&wanted, @$ENV{HOME}); 
open (FILEIN, $file) or die "couldn't open $file for read: $!\n";

我真的不明白wanted子程序在这个模块中是如何工作的。如果有人知道另一种方式来实现我上面描述的代码,请随时提出建议。谢谢

编辑: 如果我想使用命令行选项该怎么办?像这样:

#!/usr/bin/perl
use strict; use warnings;
use File::Find;
use Getopt::Long qw(GetOptions);

my $file = '';
GetOptions('filename|f=s' => \$file);

# I believe $ENV{HOME} is the same as $~/home/user
find(\&wanted, @$ENV{HOME});
open (FILEIN, $file) or die "couldn't open $file for read: $!\n";

如何实施这个?

2 个答案:

答案 0 :(得分:2)

文件::查找应该没问题。

你可以像这样循环遍历

find( sub {
    say $File::Find::name if ($_ eq $userInput);
}, '/');

应该做你想做的事情。除非通过chomp

传递,否则不要忘记@ARGV用户输入

'/'更改为您要搜索的目录,或者您也可以让用户指定该目录。

答案 1 :(得分:1)

一个问题是您尝试在不指定路径的情况下打开文件。您需要创建另一个变量,例如$path。现在,您可以将\&wanted作为对您在其他位置编写的子例程的引用,但您可能不得不求助于全局变量。使用闭包会更好。

您的代码可能如下所示:

#!/usr/bin/perl
use strict; use warnings;
use File::Find;
use Getopt::Long qw(GetOptions);

my ($file, $path);
GetOptions('filename|f=s' => \$file);

# Set $path when file is found.
my $wanted = sub { $path = $File::Find::name if ($_ eq $file); };

find($wanted, $ENV{HOME});
if (!$path) {
    # complain
}
open (FILEIN, $path) or die "couldn't open $file for read: $!\n";