在perl中有文件:: find的返回值吗?如何判断查找是否失败?

use*_*091 0 perl file find

我正在尝试学习perl,特别是使用File :: Find模块搜索图片的目录树,看看是否有任何文件名与相机上的文件名相匹配.如果文件名在那里,我将假设该文件已经从该相机传输,并且不再进一步处理.如果找不到文件名,我想对文件采取某种操作.

我使用find2perl创建了一个基本结构,它可以用来查找文件.但我似乎无法找到一种方法来判断发现是否失败.File :: Find :: find似乎没有返回任何值来处理,我不确定如何操作,或使用它正在使用的'&wanted'子目录中的任何返回值.

确定File :: Find :: find是否未成功找到任何匹配文件的最佳方法是什么?我应该使用在程序顶部设置为特定值的全局标志变量,只有在查找成功时才更改?我想我可以在查找之后检查该值,看看它是否已经改变(成功)或者没有找到(没有找到).

任何想法或建议?

这是基本结构:

  # Traverse desired filesystems
  File::Find::find({wanted => \&wanted}, '/files/multimedia/pictures/');
  exit;


  sub wanted {
      my ($dev,$ino,$mode,$nlink,$uid,$gid);

     if ( (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && /^$ARGV[0]\z/si ) {
        print("found: $name\n");
        }
     }
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 5

如果未找到所需文件,wanted则不会调用子例程.

我通常做的正是你建议的 - 在调用之前将标志设置为false find,并将其wanted设置为true.

那是在我真正需要知道这些信息的情况下 - 我实际上并不需要它很长一段时间.

实际上,计数可能比标志更好,因为它可以提供更多信息.以下代码:

use File::Find;

sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);
    $quant += 1;
    if ( (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && /^$ARGV[0]\z/si ) {
        print("found: $name\n");
    }
}

$quant = 0;
File::Find::find({wanted => \&wanted}, '/nosuchdir');
print ("Found $quant files in /nosuchdir\n");

$quant = 0;
File::Find::find({wanted => \&wanted}, '/tmp');
print ("Found $quant files in /tmp\n");
Run Code Online (Sandbox Code Playgroud)

在我的系统上生成以下输出:

Found 0 files in /nosuchdir
Found 39 files in /tmp
Run Code Online (Sandbox Code Playgroud)

这样一来,一个$count零意味着没有文件被发现,什么都告诉你,那里文件(也告诉你有多少).