第一章 简介

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的更多相关文章

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

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

  2. Perl语言入门

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

  3. Perl语言入门14-17

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

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

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

  5. Perl 语言入门6-9

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

  6. Perl语言入门--3--文件读取与写入

    现有文件test.txt,内容为:"123\n456" 1,打开文本test.txt #!/usr/bin/perl open d,"test.txt"; d ...

  7. Perl语言入门--4--函数

    1.chop函数:删除标量变量或数组中每个字符的最后一个字 举个栗子: #!/usr/bin/perl $v = 'Flowers'; $r = chop($v); print "$v (w ...

  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语言入门:第六章习题:处理用户所指定的名字并汇报相应的姓。

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

随机推荐

  1. 23.合并k个有序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1-&g ...

  2. Beta阶段第九次会议

    Beta阶段第九次会议 时间:2020.5.25 完成工作 姓名 完成工作 任务难度 完成度 ltx 1.发现小程序身份认证bug和新闻列表获取bug2.修改新增页面风格 轻 90% xyq 1.修改 ...

  3. 攻防世界 web3.backup

    如果网站存在备份文件,常见的备份文件后缀名有:.git ..svn..swp..~..bak..bash_history..bkf尝试在URL后面,依次输入常见的文件备份扩展名. ip/index.p ...

  4. RecyclerView使用详解

    使用RecyclerView要引用对应的jar包,但最新版的项目中,不用引用也可以使用. implementation 'com.android.support:recyclerview-v7:27. ...

  5. minimum-depth-of-binary-tree leetcode C++

    Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the short ...

  6. SpringBoot目录文件结构总结(5)

    1.目录 src/main/java :存放java代码 src/main/resources static:存放静态文件,比如css.js.image(访问方式 http://localhost:8 ...

  7. 【死磕 NIO】— Proactor模式是什么?很牛逼吗?

    大家好,我是大明哥. 上篇文章我们分析了高性能 IO模型Reactor模式,了解了什么是Reactor 模式以及它的三种常见的模式,这篇文章,大明再介绍另外一种高性能IO模型: Proactor. 为 ...

  8. LoadRunner12回放与录制

    系统版本 本人的操作系统是win10 版本是loadrunner12. 开启loadrunner自带的机票预订服务器 找到loadrunner自带的机票预订测试服务器下图中点击启动 如下图所示代表启动 ...

  9. Linux mem 2.5 Buddy 内存回收机制

    文章目录 1. 简介 2. LRU 组织 2.1 LRU 链表 2.2 LRU Cache 2.3 LRU 移动操作 2.3.1 page 加入 LRU 2.3.2 其他 LRU 移动操作 3. LR ...

  10. c++学习笔记3(内联函数)

    函数调用是有开销的,调用时需将参数放入栈中,返回地址也要放入,返回时还需从栈中取出,跳转返回地址去执行,需几条语句的时间,如果本身程序代码短,则会显得十分浪费,所以引入了内联函数的机制 写法:在函数前 ...