设为首页 收藏本站
查看: 1013|回复: 0

[经验分享] 神奇的Perl-哈希和数组(7)

[复制链接]

尚未签到

发表于 2017-5-19 08:50:37 | 显示全部楼层 |阅读模式
声明:本神奇的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
 
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文件,其内容是按目录归类的文件列表。
我们先简单介绍一下如何操作目录及文件:
通常使用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>  ';

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378927-1-1.html 上篇帖子: perl: warning: Falling back to the standard locale 下篇帖子: Perl学习笔记-列表和数组
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表