如何将参数传递给处理每个文件的File :: Find子例程?

时间:2010-01-13 12:45:08

标签: perl file-find

使用File::Find,如何将参数传递给处理每个文件的函数?

我有一个遍历目录的Perl脚本,以便将一些3通道TIFF文件转换为JPEG文件(每个TIFF文件3个JPEG文件)。这有效,但我想将一些参数传递给处理每个文件的函数(不使用全局变量)。

以下是我尝试传递参数的脚本的相关部分:

use File::Find;

sub findFiles
{
    my $IsDryRun2 = ${$_[0]}{anInIsDryRun2};
}

find ( { wanted => \&findFiles, anInIsDryRun2 => $isDryRun }, $startDir);

$isDryRun是一个标量。 $startDir是一个字符串,是目录的完整路径。

$IsDryRun2未设置:

  

在连接(。)或字符串中使用未初始化的值$ IsDryRun2             TIFFconvert.pl第197行(#1)         (W未初始化)使用未定义的值,就好像它已经存在一样         定义。它被解释为“”或0,但也许这是一个错误。         要禁止此警告,请为变量分配定义的值。

(没有参数的旧电话是:find ( \&findFiles, $startDir);


测试平台(但是生产主页将是Linux机器,Ubuntu 9.1,Perl 5.10,64位):ActiveState Perl 64位。 Windows XP。从perl -v: v5.10.0构建,用于MSWin32-x64多线程二进制构建1004 [287188]由ActiveState提供

3 个答案:

答案 0 :(得分:15)

您需要使用所需参数创建一个调用所需子的子引用:

find( 
  sub { 
    findFiles({ anInIsDryRun2 => $isDryRun });
  },
  $startDir
);

这或多或少是在讨论。这只是漂亮 currying。 :)

答案 1 :(得分:3)

您可以创建任何类型的代码引用。您不必使用对命名子例程的引用。有关如何执行此操作的许多示例,请参阅我的File::Find::Closures模块。我创建了该模块来准确回答这个问题。

答案 2 :(得分:3)

请参阅PerlMonks条目 Why I hate File::Find and how I (hope I) fixed it ,了解如何使用闭包。

相关问题