vike681 发表于 2017-5-19 08:50:37

神奇的Perl-哈希和数组(7)

声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载


1.1          push、pop、shift、unshift



1、push在数组末尾处增加元素,pop就是从数组的末尾取出元素。具体语法如下:
push ARRAY, (以逗号分隔的要增加的值列表)
    push ARRAY,要增加的值
 
pop 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
 


1.2         第四个任务



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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|$lsfile<br>";#匹配文件名写入HTML文件的body部分
}
}
close DH;
$filediryj{$filedir}=$flcount;#目录下匹配文件数目
say MYTXT "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|共$flcount个匹配文件<br>";
}
#输出HTML文件尾
say MYTXT '</body>';
say MYTXT '</html>';
页: [1]
查看完整版本: 神奇的Perl-哈希和数组(7)