opendirDIR,$path;@arr1=readdirDIR;@arr2=grep{-T"$path$_"}@arr1;#textfilesonly@arr3=grep{!-d"$path$_"}@arr1;#nodirectories@arr4=grep{-s"$path$_"<1024}@arr1;#lessthan1K
代码解释:假如被测试的目录项是一个文本文件,那么-T文件操作符就会返回真。其实针对目录项的测试操作还有很多。(注:文件和目录在系统中都是以目录项的形式来治理的,所以要区别一个目录项指向的是一个文件还是一个目录需要相应的操作符)。注重上面的readdir函数返回指定目录下的所有目录项。因为在grep函数中对目录项的测试需要文件的完全路径,所以我们把$PATH(存储了目录项的部分路径)和$_(存储了目录项的名字)中的内容联合起来得到文件的完全路径*对目录进行递归搜索*
useFile::Find;find(&handleFind,'imac:documents:code');subhandleFind{my$foundFile=$File::Find::name;print"$foundFilen"if($foundFile=~/.html?$/i);}
RESULT:imac:documents:code:index.htmlimac:documents:code:perl:example.HTM运行结果:代码讨论:那些工作于Unix系统的Perl程序员可以非常简便的利用UNIX上提供的工具来完成许多日常的工作,比如递归的列出指定目录下的所有目录项(也就是列出指定目录及指定目录子目录下的所有目录项目)。然而Perl的一个最大的特征就是可以运行于很多的平台上。所以假如你碰巧工作在一个非UNIX的平台,或者假如你虽工作在UNIX平台,但不喜欢使用系统工具写脚本,你可以选择Perl。要完成这些巧妙的工作,你需要使用perl中的File:Find模块。当你加载了这个模块的时候,你就可以使用其中的find子函数,在调用这个函数的时候,需要带参数:第一个参数是一个函数的引用,这个函数由你自己建立,每次一个文件被找到的时候,它都会运行。接下来的一个参数是一串你想要搜索的路径。我写的这个示例脚本是运行在MacintoshOS8.x系统上的,所以我使用了Mac系统的路径分隔符:。假如是在Windows,你可以用反斜杠,假如是在Unix系统则是正斜杠(至于在Amiga系统上用什么我就不知道了)。总之,find函数将会在每次找到一个文件的时候调用你给出的子函数,而且会对子目录进行查找。在我的handledfind子函数中,我通过这个模块特定变量$File::Find::name来获得每次find找到的文件名。然后,就可以对该文件执行任何你想的测试,在上面的例子中,我们输出有.html的扩展名文件名。*文件读操作**一次读入整个文件内容。*
openFH,"<anthem";$/=undef;$slurp=;print$slurp;
运行结果:一下就显示了所有的文件内容,此刻你应该非常的自豪。:)代码讨论:尖括号<>对文件句柄进行操作,在标量上下文中它将返回文件的下一条记录,在数组上下文中它将返回所有的记录。在默认的情况下,文件中的记录被认为是由换行符分开(例如回车或其他代表新行开始的字符)。你可以重新设定这个默认的分隔符,然后Perl将会以你指定的分隔符为准来替代换行符。全局变量$/里存储了输入文件的分隔符,假如你把$/的值设置为undef,那么Perl将会认为整个文件是一条记录(因为此刻已经没有文件分隔符了)。牢记$/是全局变量,千万不要在脚本的其他地方不经意的改变它,这个错误将很难被发现。你可能会问,我们能否不改变$/,而采用把文件的所有记录读到一个数组中,然后把数组联合成一个很长的字符串(比如$slurp=join("",);)的方法实现一次读入文件。当然这也是一个有效的解决办法,但是你会发现它很慢,是否选用它取决你的应用,取决于你是否关心运行速度。*赋值**把一个文件句柄赋给另一个文件句柄*
open(MYOUT,">bottle.txt");*STDOUT=*MYOUT;print"message";
运行结果:文本文件bottle.txt现在包含message字符串。代码讨论:以前可能你配合使用过Print函数和文件句柄,但是你是否知道就算你没有使用文件句柄,Perl也默认你在使用一个称为STDOUT的句柄?C程序员知道STDOUT代表标准输出,也就是通常的屏幕,或终端窗口(或者是CGI程序的输出端-浏览器)。在这里我们完成的工作是创建我们自己的文件句柄,它指向一个给定的文件,然后我们做了一件比较鬼的工作,使用*前缀把STDOUT转换为typeglob类型。Typeglob类型的数据可以有别名,这样一个变量可能会指向另一个其他名字的变量。上面第二行代码使STDOUT指向MYOUT变量。所以执行print操作时的默认输出对象也就成为了我们创建的文件句柄。*同时向两个文件句柄执行写操作*
评论加载中…
![]() |