Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1760929
  • 博文数量: 100
  • 博客积分: 10122
  • 博客等级: 上将
  • 技术积分: 4092
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-04 20:28
文章分类

全部博文(100)

文章存档

2010年(2)

2009年(28)

2008年(70)

我的朋友

分类:

2008-08-04 06:23:41

假设你有一个文件夹,你要删除里面类似这样命名的文件 :
/path/to/dir/000000 - Smooth Faker
/path/to/dir/000000 - Rubber Hocker
...

在 perl 里你可以用很多方法得到这样的文件列表(),诸如opendir后grep, find函数,当然还有更容易让shell迷想起的glob函数。 不过关于glob函数,这里有个很大的陷阱,如果不注意他将可能导致灾难后果,比如:

unlink glob("/path/to/dir/000000 - *");

看上去似乎没问题,但这个危险的操作可以删除你当前文件下的的所有文件。

让我们仔细看文档, perldoc File::Glob :

       Since v5.6.0, Perl’s CORE::glob() is implemented in terms of
       bsd_glob().  Note that they don’t share the same
       prototype--CORE::glob() only accepts a single argument.  Due to
       historical reasons, CORE::glob() will also split its argument on
       whitespace, treating it as multiple patterns, whereas bsd_glob()
       considers them as one pattern.

也就是说,这里的 glob 操作变成了, File::Glob::bsd_glob("/path/to/dir/00000", "-", "*"), 你将会删掉'*'匹配的所有文件。解决办法是用双引号括起整个部分,或者使用File::Glob::bsd_glob。

按理这个是已经在文档中说明了,不应该算是陷阱,不过如果你仅仅用 perldoc -f glob 查看,那么并没有类似的说明和警告而是让你转而看 File::Glob 的说明。(常常的)偷懒和想当然的结果就是,忽视了这里最大的一个可能引爆的漏洞。所以这里的建议是不使用glob而是使用File::Glob::bsd_glob。

阅读(2287) | 评论(0) | 转发(0) |
0

上一篇:othello-game on N800

下一篇:HellwolfDotEmacs

给主人留下些什么吧!~~