Chinaunix

标题: 请教各位高手 perl中find模块的问题 [打印本页]

作者: peakgod    时间: 2006-11-11 21:38
标题: 请教各位高手 perl中find模块的问题
在语句 find sub {print "Files: $File::Find::name\n" if !-d},'.';
怎样才能将找到的目录放到数组中呢?请各位大侠指教。
另,请问语句中的sub是怎样解释呢?
谢谢各位了。
作者: aaronvox    时间: 2006-11-13 11:39
我不知道怎么解释
但是你应该贴出来一段可执行代码供大家测试
或者写的罗嗦写而不至于简练到看不懂

我习惯


  1. find(\&wanted,"$opt_path");

  2. sub wanted
  3. {
  4.     /$opt_name/
  5.     &&
  6.     (($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
  7.         $atime, $mtime, $ctime, $blksize, $blocks)
  8.         = lstat($_))
  9.     &&
  10.     ( eval "$mtime $opt_symbol $opt_time" )
  11.     &&
  12.     unlink($_)
  13.     &&
  14.     ( eval "print STDOUT \"$File::Find::name\n\" if $opt_print" );
  15. }

复制代码

作者: peakgod    时间: 2006-11-13 13:44
标题: 回复 2楼 aaronvox 的帖子
感谢你的答复。

find sub {print "Files: $File::Find::name\n" if !-d},'.';
上面的语句就是可以直接被执行,你所在目录下的文件和目录就会显示出来,但是我不知道怎么将打印出来的目录直接放在数组里。

sub的作用本来是定义函数,但是在此语句中没有看出是做了什么?

还请给予进一步解释,谢谢了。
作者: aaronvox    时间: 2006-11-13 15:08
原帖由 peakgod 于 2006-11-13 13:44 发表
感谢你的答复。

find sub {print "Files: $File::Find::name\n" if !-d},'.';
上面的语句就是可以直接被执行,你所在目录下的文件和目录就会显示出来,但是我不知道怎么将打印出来的目录直接放在数 ...


这么理解吧
find接收两个参数 一个处理文件和目录的子例程引用 一个操作具体目录


  1. find sub {print "Files: $File::Find::name\n" if !-d},'.';
复制代码

这里面参数1为sub提供的闭包引用

  1. sub {print "Files: $File::Find::name\n" if !-d}
  2. 并且指明此文件不是目录!-d
复制代码

参数2为'.'当前目录

  1. '.'
复制代码


详细情况请查看perl高级编程中的闭包部分


我用的时候都是处理固定目录下的文件
只能获得文件的具体名称$File::Find::name
找到的目录是后面输入的本身就是知道的

pod中有描述用法:

  1.     use File::Find;
  2.     find(\&wanted, @directories_to_seach);
  3.     sub wanted { ... }

  4.     use File::Find;
  5.     finddepth(\&wanted, @directories_to_search);
  6.     sub wanted { ... }

  7.     use File::Find;
  8.     find({ wanted => \&process, follow => 1 }, '.');

  9.     find(\&wanted,  @directories);
  10.     find(\%options, @directories);

  11.     The name of currently processed directory is in $File::Find::dir.
  12.     说明当你获得$File::Find::name的同时可得到工作目录$File::Find::dir
  13.     可以在sub闭包里处理 或者 单独像我上面的例子里写个wanted函数中处理到你需要的数组中
复制代码

[ 本帖最后由 aaronvox 于 2006-11-13 15:17 编辑 ]
作者: peakgod    时间: 2006-11-13 15:19
标题: 回复 4楼 aaronvox 的帖子
感谢aaronvox的指导,我去学习闭包的知识。
我用了一个笨办法:把生成的目录先print到一个文件里,然后把文件读到数组里,虽然解决了,但是感觉绕了好大的弯。呵呵。
作者: aaronvox    时间: 2006-11-13 15:30
貌似在wanted函数里不能直接写代码
只能写些一句搞定的判断或者操作

例如

  1. ( eval "print STDOUT \"$File::Find::name\n\" if $opt_print" );
复制代码


所以你可以在外面设置全局变量
然后用eval拼成个代码行执行就可以了
例如下面这句是判断时间是否符合条件的 所用的都是外部的全局变量

  1. ( eval "$mtime $opt_symbol $opt_time" )
复制代码

作者: peakgod    时间: 2006-11-14 09:11
标题: 回复 6楼 aaronvox 的帖子
非常感谢aaronvox!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2