我是Perl的新手.我正在尝试编写一个Perl脚本,它打印目录中所有文件的内容,并递归执行,直到打印目录/子目录中的所有文件.我正在使用以下子程序.
sub print_files_in_dir {
my $file = shift;
if(-d $file){
my @files=glob "$file/*";
foreach my $file (@files){
if(-d $file){
print_files_in_dir $file;
}
else {
print_file $file;
}
}
else {
print_file $file;
}
}
Run Code Online (Sandbox Code Playgroud)
其中print_file是sub,用于打印单个文件的内容.我得到这个错误,我试图用一个名为dir1的目录执行此代码,该目录包含另一个名为dir2的目录.
无法通过包"dir1/dir2"找到对象方法"print_files_in_dir"(也许你忘了加载"dir1/dir2"?)
无法弄清楚为什么会抛出这个错误?
如你所知,在参数列表周围省略parens可能会给你带来非常奇怪的错误.有些甚至是沉默的.例如,print (4+6)*2打印10!(好吧,如果你有警告就会发出警告,所以它并不是真的沉默,但它也不是致命的.)如果一个人遗漏了那些parens,一定要小心.
我写这篇是因为我发现你的问题glob; 如果路径中包含某些字符(例如空格),它将无法工作.
glob "$file/*"
Run Code Online (Sandbox Code Playgroud)
应该
glob "\Q$file\E/*"
Run Code Online (Sandbox Code Playgroud)
因为我在这里,所以可以消除一些冗余.你的子崩溃到:
sub print_files_in_dir {
my $file = shift;
if (-d $file) {
print_files_in_dir($_) for glob "\Q$file\E/*";
} else {
print_file($file);
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,您可以使用File :: Find :: Rule进一步折叠它.
use File::Find::Rule qw( );
print_file($_) for File::Find::Rule->file->in('.');
Run Code Online (Sandbox Code Playgroud)