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

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. Java中的函数式编程(六)流Stream基础

    写在前面 如果说函数式接口和lambda表达式是Java中函数式编程的基石,那么stream就是在基石上的最富丽堂皇的大厦. 只有熟悉了stream,你才能说熟悉了Java 的函数式编程. 本文主要介 ...

  2. BUAA 2020 软件工程 结对项目作业

    Author: 17373051 郭骏 3.28添加:4.计算模块接口的设计与实现过程部分,PairCore实现的细节 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) ...

  3. Spring源码解读(二):Spring AOP

    一.AOP介绍 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP).OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面.方面实现了诸如跨越多种类型和对象的事务 ...

  4. 到底能不能用 join

    互联网上一直流传着各大公司的 MySQL 军规,其中关于 join 的描述,有些公司不推荐使用 join,而有些公司则规定有条件的使用 join, 它们都是教条式的规定,也没有详细说其中的原因,这就很 ...

  5. 查看VCS版本的指令

    以本人电脑的安装目录为例:在任意path下打开terminal执行命令行/usr/local/vcs2018/bin/vlogan -ID -full64 /usr/local/vcs2018为VCS ...

  6. Openssl基本组成与应用

    SSL与Openssl有什么关系? ssl是一种应用,表示安全的套接字层,是为那些明文应用提供加密机制的应用,openssl是一个实现该协议的库,当然还实现了其他很多东西,并且是open source ...

  7. 『学了就忘』Linux基础命令 — 23、文件基本权限的介绍和作用

    目录 1.基本权限的介绍 (1)权限位的含义 (2)权限的优先级 2.权限的基本作用 (1)权限含义的解释 (2)目录权限说明 1.基本权限的介绍 (1)权限位的含义 前面讲解ls命令时,我们已经知道 ...

  8. SpringCloud 2020.0.4 系列之 JWT用户鉴权

    1. 概述 老话说的好:善待他人就是善待自己,虽然可能有所付出,但也能得到应有的收获. 言归正传,之前我们聊了 Gateway 组件,今天来聊一下如何使用 JWT 技术给用户授权,以及如果在 Gate ...

  9. js 事件流和事件冒泡阻止

    js 事件流和事件冒泡阻止 事件流 当浏览器发展到第四代的时候(IE4与Netscape4)浏览器开发团队遇到一个有意思的的问题: 页面的哪一部分会拥有某个特定的事件? 比如在纸上画上一组同心圆,如果 ...

  10. 【JAVA】笔记(3)---封装;如何选择声明静态变量还是实例变量;如何选择声明静态方法还是实例方法;静态代码块与实例代码块的执行顺序与用途;

    封装: 1.目的:保证对象中的实例变量无法随意修改/访问,只能通过我们自己设定的入口,出口(set / get)来间接操作:屏蔽类中复杂的结构,使我们程序员在主方法中关联对象写代码时,思路/代码格式更 ...