1

我是 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;
 }
}

其中 print_file 是 sub 打印单个文件的内容。当我尝试使用目录 dir1 执行此代码时出现此错误,该目录包含另一个名为 dir2 的目录。

无法通过包“dir1/dir2”找到对象方法“print_files_in_dir”(也许您忘记加载“dir1/dir2”?)

无法弄清楚为什么会引发此错误?

4

4 回答 4

6

正如您所了解的,省略参数列表周围的括号会给您带来非常奇怪的错误。有的甚至沉默。例如,print (4+6)*2打印10!(好吧,如果你有警告,它会发出警告,所以它并不是真正的沉默,但它也不是致命的。)如果有人省略了那些括号,则必须小心。

我写这个是因为我注意到你的问题glob;如果路径中包含某些字符(例如空格),它将不起作用。

 glob "$file/*"

应该

 glob "\Q$file\E/*"

既然我在这里,就可以消除一些冗余。您的子折叠为:

sub print_files_in_dir {
   my $file = shift;
   if (-d $file) {
      print_files_in_dir($_) for glob "\Q$file\E/*";
   } else {
      print_file($file);
   }
}

实际上,您可以使用File::Find::Rule进一步折叠它。

use File::Find::Rule qw( );
print_file($_) for File::Find::Rule->file->in('.');
于 2012-06-14T00:26:05.970 回答
4

您正在与“间接函数调用”发生冲突,这是一个令人困惑的 OOP 功能,可能会导致以下问题:

print_files_in_dir $file;

像你说的那样被解析,这意味着完全不同和意想不到的东西:

$file->print_files_in_dir();

在你的函数调用上使用括号(像这样),这不会发生:

print_files_in_dir($file);

也一样print_file

于 2012-06-13T23:34:46.867 回答
1

在您调用print_files_in_dir编译器时,还没有看到子例程的完整定义,所以它不知道它是什么。从您使用的语法来看,最好的猜测是它是一个方法调用。

您可以通过在定义子例程之前预先声明它来纠正这个猜测,就像这样

sub print_files_in_dir;

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;
  }
}
于 2012-06-13T23:54:33.660 回答
-1

如果您的动机是递归列出文件,请尝试以下操作:

     system("ls -R")
于 2012-06-13T23:38:59.780 回答