Perl 入门笔记

Larry 在20世纪80年代设计创建了 Perl,现在由 Perl5 Porters 团队维护 。Perl 语法简洁,适合处理与文字有关的任务。
CPAN 是一个存放用 Perl 编写的软件及其文档的网络存档,在全球有数百个镜像站点。

1. 数据结构

A variable is a name for a container that holds one or more values.
A scalar is a single thing.
A list is an ordered collection of scalars. An array is a variable that contains a list. Each element of an array or list is a separate scalar value, these are ordered and indexed by integers (0-based).

1.1 标量(scalar)

1) 值类型

  • 数字
    Perl 内部按照双精度浮点数来保存和运算数字。
书写方式例子
整数literal*-10, 0, 10, 87654321(或87_654_321,只能用下划线分割)
浮点数literal-1.25, 255.00, 3.14e10,
非十进制整数literalbinary: 0b1010; oct: 0377, 03_77; hex: 0xfff

* A literal is how you represent a value in your source code.

  • 字符串
    字符串是一个字符的序列。字符通常由可输出的(ASCII码值32-126)字母、数字和标点符号组成。Perl 支持 Unicode 字符,但是需要手工加上use utf8;指令。
书写方式例子
单引号字符串literal‘hello\n’,反斜线可以转义反斜线和单引号。
双引号字符串literal“hello\n”, 反斜线可以转义多种控制字符。支持变量内插*。

* 变量内插:将双引号内 标量变量 替换成 标量变量值 。

  • undef
    首次赋值前,变量的初始值为 undef(未定义)值。defined()可用于判断值属于undef 还是空字符串。

2) 操作符

操作符数值字符串
运算+, -, *, /, %, **, …., x, …
相等==eq
不等!=ne
大于>gt
小于<lt
大于等于>=ge
小于等于<=le

3) 标量变量

存储一个值(标量值)的变量称为标量变量。标量变量的名称一般为$[a-zA-Z_]\w+,但在启用 utf8 编译指令后,标识符不局限于ACSII字符。标量变量常见的操作包括赋值(=)、二目赋值(+=, .=, …)等。

1.2 列表(list)和数组(array)

# acess, assign, literal
$a[0], $a[1], $a[2] = (1,2,3);
@b = (1..10);                      # 范围操作符
@words = qw(kitty mimmy geroge);   # quoted word, delimeters: (), //, !!, ...

# 末尾:pop & push
pop @b;      # return 10, @b is 1..9
push @b,9;
# 开头:shift & unshift
shift @words;             # return kitty, @words id mimmy,geroge
unshift @words, 'kitty';
# 切片:splice
splice @b, 0, 3, qw(a b);    # @ is (a,b,4,5,6,7,8,9,10)
                            # 目标数组,起始位置,长度(可选),替换列表(可选)

# reverse; sort
@rb = reverse @b;   # not inplace
@wb = sort @words;  # not inplace
# each return index and values
while (my($i,$v) = each @words) {
    say "$i: $v";
}

1.3 哈希

与数组类似,哈希也是用于存放任意值的数据结构。但不同于数组以数字为索引,哈希使用名字(任意唯一的字符串,称为)作为索引。

# 访问
$hash{$key};          # 访问哈希元素
%hash;                # 访问整个哈希

# 赋值
## 列表
my %ha = (
  beijing => 'China',
  london => 'UK'
);

函数

keys
values
each
exists
delete

2. 控制结构

2.1 if 和 unless

$line = <STDIN>;
chomp($line);
if ($line eq "\n") {
    print "A newline";
} else {
    print $line;
}

2.2 while 和 until

# 初始化;
# while (测试) {
# }
$count = 0
while ($count < 10) {
    $count += 2;
    print;
}

2.3 for 和 foreach

Perl 通过圆括号里的分号(两个分号或者没有分号)判断控制结构是for循环还是foreach循环。

# for (初始化; 测试; 递增) {
#     程序主体;
# }

# 
@b = (1..3);
print "Before foreach: @b\n";

# 控制变量$i是列表元素本身,而非复制品
# 循环结束后,$i是循环前的值(此例是undef)
# 如果不写控制变量,Perl使用默认变量$_
foreach $i (@b){
    print "$i\n";
    $i="m_$i";
    print "$i\n";
}

print "After foreach: @b";

2.4 其它

为了简化代码书写,表达式后面可以接一个用于控制其行为的修饰符(表达式修饰符)。

my $positive_num = $n if $n > 0;
$n++ while $n < 10;
&f($_) foreach @arr;

条件操作符类似于if-then-else结构。由于使用时需要三个操作数,因此也成为三目操作符。

# condition_expr ? if_true_expr : if_false_expr
my $size =
    ($width < 10) ? "small" :
    ($width < 20) ? "medium" :
    ($width < 50) ? "large" :
                    "huge";

逻辑操作符

# 

2.5 循环控制

last操作符能立即中止循环的执行。next操作符会跳到当前循环块的底端(即结束当前这次迭代),继续执行下一次迭代。redo能将控制返回到当前循环块的顶端,而不经过任何条件测试,也不会进入下一次循环迭代。

for (1..10) {
    print "Round $_.\n";
    print "Type: last, redo, next\n";
    chomp(my $word = <STDIN>);
    print "\n";
    last if $word =~ /last/i;
    next if $word =~ /next/i;
    redo if $word =~ /redo/i;
    print "***\n\n"
}

当需要从内层对外层循环块进行控制时,可以使用标签(label)。

LINE: while (<>) {
  for (split) {
    last LINE if /__END__/;   # 跳出标签为LINE的循环
  }
}

3. 子程序(用户自定义函数)

# 定义:sub,函数名,代码块
# 定长参数
# 私有变量
sub f1 {
    my($a,$b)=@_;   # 1.perl自动将参数列表转变为数组@_   # 2.使用my创建私有变量
    if ($a>$b) {
        $a;
    } else {
        $b;
    }
}
&f1(10,12);

# 变长参数
sub f2 {
    my($max_now) = shift @_;
    foreach (@_) {
        if ($_ > $max_now) {
            $max_now = $_;
        }
    }
    $max_now;
}
&f2(10,12,15,17);

# 任何perl子程序都有返回值,返回值默认是代码块中最后执行的表达式。也可以使用return指定。

4. 输入输出

输入


输出

文件句柄(filehandle)

# 裸字(bareword) # 裸字没有前置字符,建议使用全大写字母命名文件句柄
## 1. 默认句柄:STDIN, STDOUT, STDERR, 其余3个保留句柄名:DATA, ARGV, ARGVOUT
## 2. open & close
open HI, '<in_test';   # < 读取(默认模式)
open HO, '>out_test';  # > 创建、输出到新文件
open HOB, '>>log';     # >> 追加
### 三参数写法
open HI, '<:encoding(UTF-8)', 'in_test';   # 指定编码方式
open HO, '>:crlf', $filename;   # DOS风格换行符 转换为 Unix风格
### close
close HI;   # 重新打开文件句柄,或者程序结束时,perl会自动关闭文件句柄

# 标量变量
open my $t_fh, '<', 'test.txt'
    or die "Could not open text.txt: $!";   # die; $!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值