perl中的递归子例程出错

com*_*ose 1 perl

我是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"?)

无法弄清楚为什么会抛出这个错误?

ike*_*ami 6

如你所知,在参数列表周围省略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)