免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3949 | 回复: 6
打印 上一主题 下一主题

请教各位高手 perl中find模块的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-11 21:38 |只看该作者 |倒序浏览
在语句 find sub {print "Files: $File::Find::name\n" if !-d},'.';
怎样才能将找到的目录放到数组中呢?请各位大侠指教。
另,请问语句中的sub是怎样解释呢?
谢谢各位了。

论坛徽章:
0
2 [报告]
发表于 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. }

复制代码

论坛徽章:
0
3 [报告]
发表于 2006-11-13 13:44 |只看该作者

回复 2楼 aaronvox 的帖子

感谢你的答复。

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

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

还请给予进一步解释,谢谢了。

论坛徽章:
0
4 [报告]
发表于 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 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-11-13 15:19 |只看该作者

回复 4楼 aaronvox 的帖子

感谢aaronvox的指导,我去学习闭包的知识。
我用了一个笨办法:把生成的目录先print到一个文件里,然后把文件读到数组里,虽然解决了,但是感觉绕了好大的弯。呵呵。

论坛徽章:
0
6 [报告]
发表于 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" )
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-11-14 09:11 |只看该作者

回复 6楼 aaronvox 的帖子

非常感谢aaronvox!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP