我正在尝试开发一个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";
这个的实现方式如何?
File::Find 应该没问题。
你可以像这样循环浏览所有内容
find( sub {
say $File::Find::name if ($_ eq $userInput);
}, '/');
这应该做你想做的事情。 不要忘记chomp
用户输入,除非它是通过@ARGV
传递
将'/'
更改为要搜索的任何目录,或者您也可以让用户指定该目录。
一个问题是您尝试在不指定路径的情况下打开文件。您需要创建另一个变量,例如$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";