欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-29 16:23:49
...
声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载

1.1          pushpopshiftunshift

1push在数组末尾处增加元素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

 

2unshift在数据的起始增加元素shift在数组的起始取出一个元素。shift弹出数组的值,并返回它,unshift的队列中增加值。具体语法如下:

unshift (ARRAY,(以逗号分隔的要增加的值列表))

unshift ARRAY,要增加的值

 

shift ARRAY

比如:

    

 

 输出如下:

1

0

-1

3、通过对pushpopshiftunshift使用组合,可以实现堆栈和队列的操作。

1)堆栈,后进先出,通过pushshift组合实现

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)队列,先进先出,通过pushshift组合实现

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文件,其内容是按目录归类的文件列表。

我们先简单介绍一下如何操作目录及文件:

通常使用opendirclosedir 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>  ';