Perl 语言入门1-5
第一章 简介
perl -v
文字处理,编写小型CGI脚本(Web服务器调用程序)的最佳语言
CPAN
: Perl综合典藏网
shebang
:
#! /usr/bin/perl
或#! /usr/local/bin/perl
perldoc
第二章 标量
- 数字
1.25
-1.2e24
3
61_300_100
0377 #八进制
0xff #十六进制
ob1111111 #十六进制
- 运算符
+
-
*
/
%
**
- 单引号和双引号
'hello\n' #\n两个字符
"hello\n" #换行符
双引号内转义:
\n
\r #回车
\t
\f #换页
\b #退格
\\ #单反斜线
\l #下个字母变小写
\L #所有字母变小写
\u
\U
- 字符串操作符
"hello" . "world" #"helloworld",连接操作符必须显式
"fred"x3
5x4.8 #"5555"
"12fred34" * "3" #36 数字与字符串自动转换
- Perl内置警告
#! /usr/bin/perl -w
#! /usr/bin/perl
use warnings;
#! /usr/bin/perl
use diagnostics; #更为详尽的警告
- 双目赋值操作符
$fred = $fred + 5; $fred += 5;
$barney = $barney * 5; $barney *= 5;
$str = $str. ""; $str .=""; #等于追加操作符
- 标量内插
print "the answer is", 6*7, ".\n";
$meal = "steak";
$bar = "fred eat a $meal"; #等价
$bar = "fred eat a". $meal;
$bar = "fred eat ${meal}s.\n"; #steaks
#单引号不能内插变量
- 比较操作符
数字:== != < > <= >=
字符串:eq ne lt gt le ge
- if控制结构
比较操作符:以上
布尔值:1(True) undef(False)
获取用户输入
<STDIN>
去除末尾换行符:
chmop
chomp($text = <STDIN>)
undef
未定义值,空的,变量首次赋值前就是这个。所以才可用$sum += 4
,$string .= "more text\n"
等操作defined
函数:判断某个字符是undef
而非空字符串,如果是undef
,则返回假
第三章 列表与数组
- 列表是数据,数组是储存列表的变量
$#array
最后一个数组元素的索引- 列表直接量
(1,2,3,"red")
(1..5,9)
(5..1) #空列表,因为只能向上计数
(0..$#array)
($m..$n)
("fred","barney","betty")
#简写:省去引号逗号
qw(fred barney betty)
qw! fred barney betty !
qw(this is a test\!) #转义
- 列表赋值:
($fred,$barney)=("test",undef)
($fred,$barney)=qw(a,b,c,d) #忽略cd
($fred,$barney)=qw(a) #$barney自动为undef
@rocks=qw(slate lava)
#数组只能包含标量,不能包含其他数组?
- 数组函数:
#pop:弹出数组最后一个元素
@array = 5..9;
$fred = pop @array;
#push:压入一个元素到数组最后
push (@array,8);
push @array, 1..10;
@other = qw(1 2 3);
push @array, @other; #注意不能直接操作列表
#shift:取出数组第一个元素
$m = shift @array;
#unshift:添加数组第一个元素
unshift @array,6;
unshift @array,@other;
#splice:添加或删除数组的中间元素
@remove = splice @array, 2; #删除原数组第三个元素后的所有元素
@remove = splice @array,2,3; #删除第3,4,5个元素(第3个参数表长度)
@remove = splice @array,1,2,qw(new); #第四个参数表补充新元素到原数组
- 字符串中数组内插
print "this is a @test\n";
#所以不想内插时@需要转义(或单引号)
- foreach 遍历数组
@rocks = qw(bedrock slate lava);
foreach $rock (@rocks){
$rock = "\t$rock";
$rock .= "\n";
}
print "The rocks are:\n",@rocks;
- 默认变量
$_
foreach(1..10){print "i can count to $_!"}
- reverse操作符
@fred= 6..10;
@two = reverse @fred;
@three = reverse 6..10;
- sort操作符
@rocks = qw(one two three four);
@sorted = sort @rocks;
@numbers = sort 98..101; #不是按数值大小排序,而是按ASCII码
- each 操作符:返回索引和值
while(my($index,$value) = each @rocks){
print "$index: $value";
}
#效果同下:
foreach $index(0..$#rocks){
print "$index: $rocks[$index]\n";
}
- 标量/列表上下文
-- 定义:同一个表达式在不同的地方具有不同的意义
@people = qw(one two three);
@sorted = sort @people; #one two three 列表上下文
$number = 42 + @people; #45 标量上下文
-- 在标量上下文中使用列表表达式
$test = reverse qw(one two); #得到owteno
-- 在列表上下文中使用标量表达式
@fred = 6*7; #生成单个元素的列表
@test = "hello" . ' ' . "world";
@test = undef; #含一个未定义元素的列表
@test = ( ); 清空数组
-- 强制指定标量上下文:scalar函数
print "I have @rocks rocks!\n"; #输出数组元素
print "I have scalar @rocks rocks!\n"; #输出元素数量,error! 函数不能直接内插
print "I have ", scalar @rocks, "rocks!\n";
- 列表中的
@lines = <STDIN>; #读入所有行
chomp @lines; #去掉所有换行符
#等同如下效果:
chomp(@lines = <STDIN>);
linux系统ctrl D
停止输入,Windows系统ctrl Z
停止输入
第四章 子程序
子程序:subroutine
用户自定义函数
调用符号:&
子程序是全局的,如果存在两个相同的子程序,后一个会覆盖前一个。子程序可放任意位置,一般在开头或结尾。
- 定义子程序
sub marine { #关键字sub,程序名marine
$n += 1;
print "hello,sailor number $n!\n"
}
&marine;
- 返回值
默认返回最后一次运算结果
sub test{
print "this is a subroutine test"; #主要用于调试
$one+$two; #返回值
}
$one = 3; $two = 5;
$three = &test;
print "\$three is $three";
- 参数:argument
-- 参数列表用数组变量@_
,这是子程序的私有变量 ,第一个参数$_[0]
,第二个参数$_[1]
......
sub max{
if ($_[0] > $_[1]) {$_[0]} else {$_[1]}
}
- 子程序中的私有变量/词法变量
最好对每个新变量都使用my声明,让其保持在自己所在的词法作用域内。
使用use strict
编译指令,强制使用一些严格的、良好的编程风格。
#几乎所有子程序都用到
sub max{
my($m,$n) = @_; #将参数赋值给私有变量
if ($m > $n) {$m} else {$n}
}
- 变长参数
#把任意长度参数列表作为参数传给子程序
sub max{
if(@_!=2){
print "warning! &max should get two arguments\n";
}
......
}
#改进上述子程序,使其接受任意长度的参数
$maximum = &max(3,4,10,5);
sub max{
my($max_sofar) = shift @_; #暂时将第一个值作为最大值
foreach($_ > $max_sofar){ #遍历其他值并进行比较
$max_sofar = $_;
}
$max_sofar;
}
对于$_ @_
等内置变量不需事先声明
- return操作符
立即停止并从子程序内返回某个值。
# 找出数组中某值的索引
my @names = qw(one two three);
my $index = &find_index("two",@names);
sub find_index{
my($what,@array) = @_;
foreach(0..$#array){
if($what eq $array[$_]){
return $_;
}
}
-1; #可省略return
}
- 子程序返回非标量:如列表、
undef
(直接在后面加return
,一般用于调试子程序有误)
sub list {
if($x < $y){
$x..$y;
} else {
reverse $y..$x;
}
}
$x = 11;
$y = 6;
@z = &list;
- 持久性私有变量:
state
多次调用子程序时,保留上次调用变量的值
第五章 输入与输出
- 读取标准输入:
行输入操作:chomp($line = <STDIN>);
while (defined ($line = <STDIN>)){ #读取、赋值、是否定义变量
print "I saw $line";
}
#等同于
while(<STDIN>){print "I saw $_";}
#比较foreach
foreach(<STDIN>){print "I saw $_";}
#while逐行读取
#foreach全部读取作为列表,再逐项处理列表内容
钻石操作符读入:
while(<>){
chomp; #默认作用在$_
print "It was $_ that I saw!\n";
}
- 调用参数:
@ARGV
@ARGV = qw(file1 file2 file3);
while(<>){chomp;print "It was $_\n";}
#钻石操作符对ARGV的文件一行行读取,若为空,则改用标准输入流
- 输出到标准输出
print @names; # 打印数组元素(无空格)
print "@names"; #数组元素内插(有空格)
print (2+3)*4; #5
print ((2+3)*4); #20
- printf格式化输出
#两个参数:格式化(引号内),数据(引号外)
printf "hello, %s, you have %d books\n", $user, $num;
$user = pjx;
$num = 5;
格式化符号:
%g 自动选择浮点数、整数或指数
%d 十进制整数
%s 字符串
%f 浮点数
%% 百分号
eg:
printf "%g %g %g\n",5/2,51/17,51**17; #2.5 3 1.07e+29
printf "in %d days\n", 13.23; #in 13 days
printf "%6d\n", 45; #整数字段式右对齐
printf "%2d\n", 4567; #整数字段式左对齐
printf "%10s\n", "willma"; #字符串字段式右对齐
printf "%-10s\n", "willma"; #字符串字段式左对齐
printf "%12f\n", 6*7 + 2/3; #浮点数右对齐
printf "%0.3f\n", 6*7 +2/3; #三位小数 等于%.3f
printf "%.2f%%\n", 5.25/12; #0.44%
文件句柄
Perl进程和外界的一种I/O联系的名称;
建议全大写字母来命名;
6个特殊文件句柄名:STDIN(标准输入流,默认键盘), STDOUT(标准输出流,默认屏幕), STDERR(标准错误流,默认屏幕), DATA, ARGV
打开文件句柄
open CONFIG, 'dino';
open CONFIG, '<dino'; #只读非写方式读入
open IN, ">fred"; 重定向写入
open LOG, ">>logfile"; 追加写入,一般用于日志文件中
#另一种写法更为安全:
open CONFIG, '<','dino';
open CONFIG, '>',$file;
open LOG, '>>', &logfile_names();
#这种方法还能指定数据编码方式:
open IN, '<:encoding(UTF-8)','dino';
open IN, '<:crlf', $file; #CR-LF对(:crlf层)是DOS风格换行符(\r\n),Unix风格(\n)
open OUT, '>:crlf', $file;
- 关闭文件句柄
表示对数据流的处理已全部完成。
当重新打开某个句柄时,perl会自动关闭原句柄。
在程序结束时,perl也会自动关闭文件句柄。
最好一个open搭配一个close。
close IN;
- die处理致命错误
unix上每个运行程序都有一个退出状态(exit status),一般0代表成功,非0代表失败。
if(! open LOG, '>>', 'logfile'){die "can't create logfile: $!"} #特殊变量$!表解释性的系统错误信息
if(@ARGV <2 ){die "not enough arguments\n"}
warn发出普通警告信息
功能和die类似,但不会终止程序。
die和warn以及Perl内部的出错信息都会自动默认送到STDERR。 也可指定到错误日志中。say输出
功能和print差不多。但每行内容会自动加上换行符。
say "hello perl!";
say IN, "hello"; #指定句柄
- 标量变量中的文件句柄
一般小脚本(如生物信息),用裸字更快捷。对于大一点的程序,用标量变量存储文件句柄,控制作用域,方便调试和维护。
my $rock_fh; #确保该变量预先是空的
open $rock_fh, '<', 'rock.txt' or die "could not open rock.txt: $!";
while(<$rock_fh>){
chomp;
...
foreach my $rock (qw(slate lava grant)){
say $rock_fh $rock; #句柄变量无逗号
}
}
print $rock_fh "limestone\n"; #句柄变量后无逗号
close $rock_fh;
与裸字的不同:
print $rock_fh, "limestone\n"; #error
print STDOUT;
print $rock_fh; #error,perl会认为是个标量变量
print {$rock_fh}; #正确打印$_中内容
Perl 语言入门1-5的更多相关文章
- Perl语言入门: 斜线不是元字符,所以在不作为分隔符时不需要加上反斜线。
Perl语言入门: 斜线不是元字符,所以在不作为分隔符时不需要加上反斜线.
- Perl语言入门
Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言". Perl语法基础: (1)Perl程序由声 ...
- Perl语言入门14-17
---------第十四章 字符串与排序------------------- index查找子字符串 my $stuff = "howdy world!"; my $where ...
- Perl语言入门(中文版)(第6版) 东南大学出版社
第一章简介 问题与答案 这本书适合你吗? 为何有这么多的脚注? 关于习题和解答? 习题前标的数字是什么意思? 如果我是Perl讲师? “Perl”这个词表示什么意思? Larry为什么要创造Perl? ...
- Perl 语言入门6-9
---- 第6章 哈希----------- 简介 键值对.键和值都是任意标量,但键总是会被转换成字符串. 键唯一,值可重复. 应用场景:一组数据对应到另一组数据时. 如找出重复/唯一/交叉引用/查表 ...
- Perl语言入门--3--文件读取与写入
现有文件test.txt,内容为:"123\n456" 1,打开文本test.txt #!/usr/bin/perl open d,"test.txt"; d ...
- Perl语言入门--4--函数
1.chop函数:删除标量变量或数组中每个字符的最后一个字 举个栗子: #!/usr/bin/perl $v = 'Flowers'; $r = chop($v); print "$v (w ...
- Perl语言入门--2--变量与字符串
一.$ 简单变量:$ 以$开头+字母或下划线 区分大小写,变量长度不限,没有关键字,但不能和默认变量重复 1.整数的表示: 12 12e2 #1200 -12 #-12 1_200_ ...
- Perl语言入门--1--perl的包安装
A. 手工安装 从CPAN下载了DBI模块1.13版的压缩文件DBI-1.13.tar.gz.假设放在/usr/local/src(一般需要编译安装的软件,都放在此目录下安装). # cd /usr ...
- Perl语言入门:第六章习题:处理用户所指定的名字并汇报相应的姓。
37 print "\n----------------------------------_exercise_6_1--------------------------\n"; ...
随机推荐
- Java:包装类小记
Java:包装类 对 Java 中的 包装类 这个概念,做一个微不足道的小小小小记 基本数据&包装类 四类八种基本数据类型: 数据类型 关键字 内存占用 取值范围 字节型 byte 1个字节 ...
- HTTP请求如何带参
这两天正好作一份API的接口文档,关于HTTP request如何传递参数不是很清楚,这里转载了他人的文档,让我明白了很多.. http://tomfish88.iteye.com/category/ ...
- GitHub README文件生成目录导航
效果 环境说明 [root@C61 ~]# cat /etc/redhat-release CentOS release 6.10 (Final) [root@C61 ~]# uname -a Lin ...
- CSP/S 2020 退役记
上一次的AFO记 上上次的AFO记 Day -INF 一条咸鱼的垂死挣扎. RP+=INF Day 0 出发辣. 早上来到机房,带上了准备的面包和泡面....然而后来嫌太占地方就没拿...草了. 而且 ...
- MySQL 的架构与组件
MySQL 的逻辑架构图设计图 连接/线程处理:管理客户端连接/会话[mysql threads] 解析器:通过检查SQL查询中的每个字符来检查SQL语法,并为每个SQL查询生成 SQL_ID. 此 ...
- 按之字形顺序打印二叉树 牛客网 剑指Offer
按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...
- 【java设计模式】(10)---模版方法模式(案例解析)
一.概念 1.概念 模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式. 它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的 ...
- DeWeb 简介
DeWeb是一个可以直接将Delphi程序快速转换为网页应用的工具! 使用DeWeb, 开发者不需要学习HTML.JavaScript.Java.PHP.ASP.C#等新知识,用Delphi搞定一切. ...
- springcloud3(六) 服务降级限流熔断组件Resilience4j
代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-gateway/src/test/java/com/ ...
- Node.js躬行记(14)——压力测试
公司有个匿名聊天的常规H5界面,运营向做一次 50W 的推送,为了能配合她的计划,需要对该界面做一次压力测试. 一.JMeter 压测工具选择了JMeter,这是Apache的一个项目,它是用Java ...