----------第十章 其他控制结构----------------

unless结构

unless($fred =~ /\A[A-Z_\w*\z]/i){print "yes";}
#等同
if(!($fred =~ /\A[A-Z_\w*\z]/i)){print "yes";}
if($fred =~ /\A[A-Z_\w*\z]/i){}else{print "yes";}

until结构

while的相反,条件为假时重复执行。

表达式简化

print "$n is a negative number.\n" if $n <0;
&error("invalid input") unless &valid($input); print " ",($n += 2) while $n <10;
$i *= 2 until $i >$j; &greet($_) foreach @person;

裸块

去掉条件表达式的代码块,并非循环,仅执行一次。

{
print "please enter a number: ";
chomp(my $n = <STDIN>);
my $root = sqrt $n; #限于此块的临时变量
print "the aquare root of $n is $root\n";
}

elsif子句

当条件太多时,会用switch/given-when等结构

if(! defined $dino){
print "undef\n";
}elsif($dino =~ /^-?\d+\.?$/){
print "integer\n";
}elsif($dino =~ /^-?\d*\.\d+$/){
print "floating point number\n";
}elsif($dino eq ''){
print "empty string\n";
}else{
print "string\n";
}

自增自减

my $bedrock = 43;
$bedrock++;
$bedrock--; #如计算列表元素个数
my @people = qw(fred bad fred bad dino fred);
my %count;
$count{$_}++ foreach(@people); #前置自增自减
my $m = 5;
my $n = ++$m; #m=n=6
my $c = --$m; #m=c=5 #后置自增自减
my $m = 5;
my $d = $m++; #d=5,m=6
my $e = $m--; #e=6,m=5 #如果不提取变量值,前置后置结果都一样
$bedrock++;
++$bedrock;

for结构

for($i = 1; $i < 10 ; $i++){ #初始化,测试,递增三部分都可为空
print "I can't count to $i\n";
}
  • for和foreach

    若for条件中无分号,等同foreach
for(1..10){print "$_\n";}
foreach(1..10){print "$_\n";}

循环控制

#last 立即中止
while(<STDIN>){
if(/_END_/){
last;
}elsif(/fred/){
print;
}
} #next 结束当前循环
while(<>){
foreach(split){ #将$_分解为单词,每个单词赋值给$_
$total++;
next if(\W); #非单词跳过,进行下次循环
$valid++;
$count{$_}++; #统计每个单词个数
}
}
foreach $word (sort keys %count){
print "$word was seen $count{$word} times.\n";
} #redo 跳回循环内的第一句
my @words = qw(one two three four);
my $error = 0;
foreach(@words){
#redo会跳回这里,重来一遍
print "word is $_";
chomp(my $try = <STDIN>);
if($try ne $_){
print "sorry,error!\n";
$error++;
redo;
}
}

三目操作符(条件操作符)?:

my $mean = $n? ($total/$n): "------";
print "mean is $mean\n"; my $location = &is_weekend($day)? "home" : "work"; #多分支
my $size =
($width <10) ? "small" :
($width <20) ? "medium" :
($width <50) ? "large" :
"extra-large"; #默认值

逻辑操作符

&& ||
if(($n != 0) && ($total/$n <5)) {print "$n\n";} #短路操作符
my $name = $name{$someone} || 'no name'; #||左边为默认值

使用部分求值操作符作为控制结构

($m < $n) && ($m = $n) #等于$m=$n if $m<$n
($m > 10) || print "this number less 10\n"; #或
($m < $n)? ($m = $x): ($n = $x) #也可用and/or
$m < $n and $m = $n; #用if更好
open my $fh, '<', $filename or die "can't open $filename: $!"; #注意不要滥用

---------第十一章 Perl模块 --------------

寻找模块

来源:Perl自带;CPAN

检查系统是否已安装模块: perldoc CGI #perl自带的CGI.pm模块。

列出所有已安装的模块:cpan -a

安装模块

一. 源码安装:
#先下载打包发布的模块文件包,解压编译。
#1.ExtUtils::MakeMaker封装的模块:
perl Makefile.PL INSTALL_BASE=/my/path/
make
#make test
make install #2.Module::Build辅助模块:
perl Build.PL --install_base=/my/path/
./Build
#./Build test
./Build install 二. Perl自带CPAN.pm模块安装
#需要联网和root权限
perl -MCPAN -e shell
进入CPAN.pm的shell中,使用相关命令:
help(帮助); m(列出所有模块); install mypm(安装);quit(退出) #或
cpan Module::CoreList LWP CGI::Prototype mypm #或
cpan -i mypm

非root安装模块

1. local::lib模块来安装新模块
wget https://cpan.metacpan.org/authors/id/H/HA/HAARG/local-lib-2.000024.tar.gz
tar xf local-lib-2.000024.tar.gz
cd local-lib-2.000024
perl Makefile.PL --bootstrap=/my/path
make test && make install
#设置环境变量:
echo 'eval "$(perl -I/my/path/lib/perl5 -Mlocal::lib=/my/path)"' >> ~/.bashrc 2. cpanm:私人的cpan下载器
wget https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7043.tar.gz
tar xf App-cpanminus-1.7043.tar.gz
cd App-cpanminus-1.7043
perl Makefile.PL
make test && make install #安装在local::lib路径下 #使用国内镜像:
echo 'alias cpanm="cpanm --mirror http://mirrors.163.com/cpan --mirror-only"' >>~/.bashrc #以后只要用cpanm Module::Name就能安装任意模块了。如cpanm Acme::Python默认安装在同local::lib的路径下man/man3/

使用简易模块

  1. File::Basename模块

    从文件全名中取出基名:
use File::Basename;
my $name = "/usr/local/bin/perl";
my $basename = basename $name; #返回perl

仅使用模块中的部分函数,避免有的函数与现有子程序名冲突。

use File::Basename qw(basename);

use File::Basename qw/ /; #不导入任何函数
use File::Basename (); #同上 my $betty = &dirname($wilm);#自定义的子程序&dirname
my $name = "/usr/bin/perl";
my $dirname = File::Basename::dirname $name; #模块中的dirname函数,/usr/bin
  1. File::Spec模块

    操作文件说明,文件名/目录名/文件系统中的其他名称。File::Spec模块是面向对象的(OO)。
use File::Basename;
use File::Spec; my $old = "/ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl/test.txt";
my $dirname = dirname $old;
my $basename = basename $old;
$basename =~ s/^/not/; my $new = File::Spec -> catfile($dirname,$basename); #->符号就是面向对象,后接方法名
rename($old,$new) or warn "can't rename '$old' to '$new': $!";
print "$old\n$new\n"; #输出/ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl/test.txt
/ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl/nottest.txt
  1. Path::Class模块

    更为友好的处理不同系统上的文件名规则
#cpanm Path::Class #安装
use Path::Class;
my $dir = dir (qw(ldfssz1 SP_MSI USER pengjianxiang Test perl));
my $subdir = $dir -> subdir('perltest'); #子目录
my $parent = $dir -> parent; #父目录
my $windir = $dir ->as_foreign('Win32'); #window系统
print "$dir\n$subdir\n$parent\n$windir\n"; #输出:
ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl
ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl/perltest
ldfssz1/SP_MSI/USER/pengjianxiang/Test
ldfssz1\SP_MSI\USER\pengjianxiang\Test\perl
  1. CGI.pm模块

    CGI(公共网关接口)定义了web服务器与外部内容生成程序之间交互的方法,通常是指CGI程序或者CGI脚本,它是在网站上实现动态页面的最简单和常用的方法。

    服务器 <-> CGI <-> 用户

  2. DBI模块

    DBI(database interface)数据库接口

use DBI;
$dbh = DBI -> connect($data_source,$username,$password);
  1. DateTime模块

    处理日期和时间。
my $dt = DateTime -> from_epoch(epoch =>  time);
print $dt->ymd;

-------第十二章 文件测试 - -----------------

文件测试操作符

-r -w -x -o :对目前的用户或组可读/写/执行/拥有的文件或目录
-R -W -X -O :对实际的用户或组可读/写/执行/拥有的文件或目录
-e:文件/目录存在
-z:文件存在且无内容
-s:文件/目录存在且有内容
-f: 普通文件
-d: 目录
-l:符号链接
-S:socket类型文件
-p:命名管道
-b:块设备文件(如挂载磁盘)
-c:字符设备文件(如I/O设备)
-M:最后一次被修改后至今的天数
-A:最后一次被访问后至今的天数
-C:最后一次文件节点编号改变至今的天数
-u/-g/-k/-t/-T/-B

示例:

die "$filename  already exists\n" if -e $filename;

warn "config file is old" if -M CONFIG >28;

my @original = qw(these are test files);
my @big_old;
foreach my $filename(@original){
push @big_old, $filename
if -s $filename >100_000 and -A $filename >90;
}

测试同一文件的多项属性

if(-r $file and -w $file){...}
if(-r $file and -w _){...} #虚拟文件句柄_
if(-r -w -x -o -d $file){...} #栈式写法,一般只用于真假判断
  • local函数:显示现在时间,格式如Wed May 29 21:41:21 2019

-----------第十三章 目录操作------------------

切换目录

chdir : 类似shell的cd
chdir '/etc' or die "can't chdir to /etc: $!";

文件名通配

my @all_files = glob '*'; #匹配所有文件(按字母顺序),但不包括点号开头文件
my @all_files = <*>; #文件名通配的另一种写法
my @pm_files = glob '*.pm'; #匹配所有pm文件

目录句柄

opendir  #对应open
readdir #对应readline
closedir #对应close
#注意读到的是目录中的文件名,而非文件内容 my $dir = '/home/pjx';
opendir DIR, $dir or die "can't open $dir: $!";
foreach $file (readdir DIR){
print "one file in $dir is $file\n";
}
closedir DIR;
#同样可用目录句柄变量my $dh来代替裸字 #如只想处理以pm结尾的文件:
while($name = readdir $dh){
next unless $name =~ /\.pm$/;
...
} #readir操作符返回的文件名不包含路径,仅文件名。

删除文件

unlink #删除文件
rmdir #删除目录 unlink qw(one two three);
unlink glob '*.pm'; my $sucess = unlink "one","two","three";
#unlink返回删除文件的个数

文件重命名

rename 'old','new'; #重命名文件
rename 'my/path/filename', 'filename'; #移动目录到同名目录
rename 'my/path/filename' => 'filename'; #同上的另一种写法

链接

link #硬链接
symlink #软链接(符号链接)
readlink #取得软链接指向位置
unlink #移除链接 link 'chicken', 'egg' or warn "can't link: $!";
symlink 'chicken', 'egg' or warn "can't link: $!";
#系统中我们的perl路径 /usr/bin/perl或/usr/local/bin/perl通常是软链接,指向真正的Perl二进制文件
my $where = readlink 'egg'; #得到'chicken'
my $perl = readlink '/usr/bin/perl'; #指向实际的perl程序

创建/删除目录

#创建mkdir
mkdir 'fred',0755 or warn "can't make fred: $!";
#0755初始权限 #删除unlink+rmdir
#rmdir只能删除空目录,所以需要先用unlink删除目录中内容
unlink glob "$temp_dir/.*";
rmdir $temp_dir;

修改权限

chmod 0755 ,'fred','barney';
#不能接受u+x类似参数

修改隶属关系

chown 1004, 100, glob '*.pm';
#用户及用户组标识符只能用数字形式

修改时间戳

utime time, time-24*60*60, glob '*';

Perl语言入门10-13的更多相关文章

  1. Perl语言入门: 斜线不是元字符,所以在不作为分隔符时不需要加上反斜线。

    Perl语言入门: 斜线不是元字符,所以在不作为分隔符时不需要加上反斜线.

  2. Perl语言入门14-17

    ---------第十四章 字符串与排序------------------- index查找子字符串 my $stuff = "howdy world!"; my $where ...

  3. Perl语言入门

    Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言". Perl语法基础: (1)Perl程序由声 ...

  4. Perl语言入门:第六章习题:处理用户所指定的名字并汇报相应的姓。

    37 print "\n----------------------------------_exercise_6_1--------------------------\n";  ...

  5. Perl 语言入门6-9

    ---- 第6章 哈希----------- 简介 键值对.键和值都是任意标量,但键总是会被转换成字符串. 键唯一,值可重复. 应用场景:一组数据对应到另一组数据时. 如找出重复/唯一/交叉引用/查表 ...

  6. Perl 语言入门1-5

    第一章 简介 perl -v 文字处理,编写小型CGI脚本(Web服务器调用程序)的最佳语言 CPAN: Perl综合典藏网 shebang: #! /usr/bin/perl 或#! /usr/lo ...

  7. Perl语言入门--4--列表

    1.列表也是数组的形式:(1,'a',2,3,4) 元素可以是任意类型,变量,表达式 2.空列表:() 单元素列表:(2)  .与值2不同 qw(1 $a str)   #qw是用空格作为分隔符,元素 ...

  8. Perl语言入门--2--变量与字符串

    一.$ 简单变量:$          以$开头+字母或下划线 区分大小写,变量长度不限,没有关键字,但不能和默认变量重复 1.整数的表示: 12 12e2 #1200 -12 #-12 1_200_ ...

  9. Perl语言入门--1--perl的包安装

    A.  手工安装 从CPAN下载了DBI模块1.13版的压缩文件DBI-1.13.tar.gz.假设放在/usr/local/src(一般需要编译安装的软件,都放在此目录下安装). # cd /usr ...

  10. Perl语言入门(中文版)(第6版) 东南大学出版社

    第一章简介 问题与答案 这本书适合你吗? 为何有这么多的脚注? 关于习题和解答? 习题前标的数字是什么意思? 如果我是Perl讲师? “Perl”这个词表示什么意思? Larry为什么要创造Perl? ...

随机推荐

  1. BPMN 學習實例

    什麼是業務流程圖? What is BPMN 業務流程建模符號(BPMN)是業務流程建模的一種方法.它基於統一建模語言(UML)中活動圖的概念,以圖形符號(業務流程圖)支持業務流程的規範.BPMN為企 ...

  2. 第五课第四周笔记3:Multi-Head Attention多头注意力

    Multi-Head Attention多头注意力 让我们进入并了解多头注意力机制. 符号变得有点复杂,但要记住的事情基本上只是你在上一个视频中学到的自我注意机制的四个大循环. 让我们看一下每次计算自 ...

  3. Beta Scrum Meeting汇总

    第0次Alpha Scrum Meeting 第1次Alpha Scrum Meeting 第2次Alpha Scrum Meeting 第3次Alpha Scrum Meeting 第4次Alpha ...

  4. [no code][scrum meeting] Beta 10

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月25日15:00,主持者:伦泽标 下次例会时间:5月26日11:30,主持者: 一.工作汇报 ...

  5. Mac上安装Grafana

    Mac上安装Grafana 一.背景 二.安装步骤 1.通过 Home Brew 安装 2.通过二进制包进行安装 1.下载 2.grafana配置文件的路径 3.修改grafana配置 1.修改默认的 ...

  6. CF375D Tree and Queries 题解

    感觉CF的题目名都好朴素的样子 你谷链接 首先这题显然是个dsu on tree 但是我不会. 其次这题显然是个莫队.这我会啊! 然后会发现好像不是很对劲.因为每次询问都有一个k,貌似和传统的莫队数颜 ...

  7. Vulnhub实战-dr4g0n b4ll靶机👻

    Vulnhub实战-dr4g0n b4ll靶机 地址:http://www.vulnhub.com/entry/dr4g0n-b4ll-1,646/ 描述:这篇其实没有什么新奇的技巧,用到的提权方式就 ...

  8. Spring Cache 带你飞(一)

    Spring 3.1 版本引入基于 annotation 的 cache 技术,提供了一套抽象的缓存实现方案,通过注解方式使用缓存,基于配置的方式灵活使用不同缓存组件.代码具有相当的灵活性和扩展性,本 ...

  9. cf18B Platforms(仔细谨慎题)

    题意: In one one-dimensional world there are n platforms. Platform with index k (platforms are numbere ...

  10. Web实时通信,SignalR真香,不用愁了

    前言 对于B/S模式的项目,基础的场景都是客户端发起请求,服务端返回响应结果就结束了一次连接:但在很多实际应用场景中,这种简单的请求和响应模式就显得很吃力,比如消息通知.监控看板信息自动刷新等实时通信 ...