#perl3-8.pl
use 5.010;
use warnings;
use strict;
my $dirs='E:\TDDOWNLOAD\latest';# 初始路径
my $lsfile;
my @filedir;
my %filediryj;#已经访问过的目录 ,哈希键值对为:目录名=>文件数目
my $flcount;
my $ppfile;#文件匹配符 以正则方式表达的
open MYTXT,">phpfiles.htm";
#输出HTML文件头
say MYTXT '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
say MYTXT '<html xmlns="http://www.w3.org/1999/xhtml"> ';
say MYTXT '<head> ';
say MYTXT '<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> ';
say MYTXT '<title>查找某目录下的某类文件</title> ';
say MYTXT '</head> ';
say MYTXT '<body> ';
$ppfile='php$'; #要寻找文件扩展名为php,php后紧跟符号$表示文件名以php结尾。
push @filedir,$dirs;
$|=1;
my $filedir;
while ($filedir=shift(@filedir)){
opendir DH,$filedir or die "不能打开$filedir"; #打开目录
say MYTXT "<br>$filedir<br>";
$flcount=0;
foreach $lsfile(readdir DH){#读取目录
#变量名=~m/正则表达式/ 表示对变量进行正则表达式匹配,
#如果匹配成功,则返回真,否则返回假
next if $lsfile=~m/^\./;#~m/^\./对$lsfile进行正则表达式匹配,^\.表示以点号开头
# .和..均以点号开头,分别表示当前路径和上一路径,它们不属于子目录和文件。
$lsfile="$filedir\\$lsfile";#”\”有特殊意义,因此必须以\\表示符号\
if ( -d $lsfile){
push @filedir,$lsfile;
}
elsif ($lsfile=~m/$ppfile/i) {
$flcount++;
print '.'; #在屏幕上输出进度
say MYTXT "<br> |$lsfile<br>";#匹配文件名写入HTML文件的body部分
}
}
close DH;
$filediryj{$filedir}=$flcount;#目录下匹配文件数目
say MYTXT "<br> |共$flcount个匹配文件<br>";
}
#输出HTML文件尾
say MYTXT '</body> ';
say MYTXT '</html> ';