神奇的Perl-哈希和数组(7)
1.1 push、pop、shift、unshift
1、push在数组末尾处增加元素,pop就是从数组的末尾取出元素。具体语法如下:
push ARRAY, (以逗号分隔的要增加的值列表)
push ARRAY,要增加的值
比如:
my @myarr;
push @myarr,-1;
push @myarr,0;
push @myarr,1;
print pop @myarr;
print "\n";
print pop @myarr;
print "\n";
print pop @myarr;
print "\n";
输出如下 :
1
0
-1
2、unshift在数据的起始增加元素,shift在数组的起始取出一个元素。shift弹出数组的值,并返回它,unshift的队列中增加值。具体语法如下:
unshift (ARRAY,(以逗号分隔的要增加的值列表))
unshift ARRAY,要增加的值
shift ARRAY
比如:
输出如下:
1
0
-1
3、通过对push、pop、shift、unshift使用组合,可以实现堆栈和队列的操作。
1)堆栈,后进先出,通过push和shift组合实现
my @myarr;
push @myarr,-1;
push @myarr,0;
push @myarr,1;
print pop @myarr;
print "\n";
print pop @myarr;
print "\n";
print pop @myarr;
print "\n";
输出如下:
1
0
-1
2)队列,先进先出,通过push和shift组合实现
my @myarr;
push @myarr,-1;
push @myarr,0;
push @myarr,1;
print shift @myarr;
print "\n";
print shift @myarr;
print "\n";
print shift @myarr;
print "\n";
输出如下:
-1
0
1
BOSS要求编写一个脚本,搜索某目录下所有以PHP扩展名结尾的源代码文件,并生成一个HTML文件,其内容是按目录归类的文件列表。
我们先简单介绍一下如何操作目录及文件:
通常使用opendir、closedir 、readdir函数操作目录,格式如下:
opendir(DH, $some_dir) || die "can't opendir $some_dir: $!";
#opendir打开目录,将目录句柄赋值给DH。$some_dir为要打开的目录名。
#开始循环读取目录下的文件
foreach $file(readdir DH){#读取目录下的文件,readdir返回文件列表
if ( -d $file){
# -d 文件名称 检测$file储存的文件名称是否为目录。
#$file是子目录,对子目录进行处理
}
else {
#$file是文件,对文件进行处理。
}
}
closedir DH;#关闭目录句柄
我们的思路是:
1) 打开要读取的目录。
2) 循环读取目录中所有文件,将新发现的子目录存储在数组中。
3) 继续取出数组中的目录,如果数组中没有元素,转到第4步,否则转到第1步。
4) 退出。
存放目录的数组采用堆栈的方式操作,可模拟深度优先搜索,较好地展示目录树结构。代码如下:
#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> ';
上一篇: 神奇的perl-哈希和数组(5)