【问题标题】:is there a return value to file::find in perl? How to tell if the find fails?perl 中的 file::find 是否有返回值?如何判断查找是否失败?
【发布时间】:2012-08-16 09:01:48
【问题描述】:

我正在尝试学习 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");
        }
     }

【问题讨论】:

标签: perl file find


【解决方案1】:

如果没有找到想要的文件,wanted 子例程将不会被调用。

我通常所做的正是您建议的 - 在调用 find 之前将标志设置为 false,并让 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");

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

Found 0 files in /nosuchdir
Found 39 files in /tmp

这样,$count 为零表示未找到任何文件,其他任何信息都告诉您个文件(并且还告诉您有多少)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2016-03-11
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多