1. 标量(变量)
- Scalar, 故以$开头
数字标量:值是“数字”的标量
Perl中的数字:
- 全部为双精度浮点数
- 科学计数法 E、e一样
- 特殊数字,如 :
较长的、不带小数点的数字,可以用下划线分开表示
3141592639 => 3_141_592_639
下划线的插入,不影响数值
字符串标量
- 标量为字符串,由引号标识(单引号/双引号)
- 字符串又可输出的字母、数字、标点符号组成
$data="Hello, World"
单引号 vs 双引号
-
转义字符, 只在双引号中有效
\n
换行
\r
回车
\t
水平制表符
\f
换页符
\l
下个字符转小写
\u
下个字符转大写
标量的声明
- 标量可以在任意位置随时声明并使用(推荐),也可以不声明而直接使用。
$test1=5;
$test2=10;
...
my $result=$test1+$test2
- 标量名:字母、数字、下划线,区分大小写。取名应和用途相关。
标量的作用域
- 标量可以被有效访问使用的范围
包变量:全局变量
私有变量,分为my 类型和local类型
-
my
变量: 只在本层({}之间,成为一层)模块可以看到这个变量 (函数变量【不包括子函数】)。 子函数不可以使用my
变量。 -
local
变量:本层和本层下层的函数都可以看到的变量(本层以上不可以用)(函数变量)。子函数可以使用local
变量。
sub g_print{
print "$x\n";
}
sub test_my{
my $x=11;
print "call-my $x\n";
g_print
}
sub test_local{
local$x=20;
print "call-local $x\n";
g_print
}
$x=9;
test_my;
# call-my 11
# 9
test_local
# call-local 20
# 20
print $x;
# 9
2. 数组
- 数组,是标量数据的有序列表,是多个标量数据的合集。
- 以
@
符号作为标识 - 列表元素,以括号标识,中间用逗号隔开
@a= (1, 2, 'Hello');
# 可以通过下标调用
print "$a[0]\n";
# 1
print "$a[1]\n";
# 2
print "$a[2]\n";
# Hello
范围操作符..
..
, 该操作符会从坐标的数字以此+1,产生一串数字
-
(1..5)
(1,2,3,4,5) -
(0,2..6,10)
(0,2,3,4,5,6,10) -
(5..1)
空列表, 因为5是不能加到1的
qw
应用于纯字符串列表
-
对于纯字符串列表, 使用
qw
来表示, 可省去对字符串加引号的过程。
形式为:
qw(string1 string2 string3)
# 空格、制表符、换行符都可以用作间隔符
等同于
("string1","string2","string3")
-
也可以用其他符号代替括号,如:
qw !string1 string2 string3!
qw /string1 string2 string3/
数组赋值
- 直接将列表传递给数组
@array=("string1",1.5,418)
-
qw
生成的列表,再赋值给数组
@array=qw(string1 string2 string3)
- 数组之间赋值
@array1=("string1",1.5,418)
@array2=@array1
# 对array2的修改不会影响array1
- 直接使用数组或者将数组赋值为变量时,表示数组的元素个数
这相当于python 当中的len(array)
#!perl -w
use warnings;
# 在这里 @ARGV 代表的是ARGV这个参数数组的长度(即输入的参数个数)
if (@ARGV != 5) {
print "Usage: perl subreads.pl reads1 reads2 random sample dir\n";
exit;
}
-
特殊的赋值方法
pop 和 push赋值
shift 和 unshift复制 -
pop
操作符
去除数组的最后一个元素(最右边),同时返回该元素的值
@array=(5..9)
$test1=pop(@array)
# test1=9
# array=(5,6,7,8)
-
push
操作符
添加一个元素(或一串元素)到数组的末尾。
@array=(5,6)
push(@array,8)
# array = (5,6,8)
push(@array,1..5)
# array = (5,6,8,1,2,3,4,5)
-
shift
操作符
去除数组最左边的元素,同时返回该元素值。
和pop
相对应
@array2=(5..9)
$test1=shift(@array)
# test1=5
# array2=(6,7,8,9)
-
unshif
操作符
添加一个元素(或一串元素)到数组的最左边。
和push
相对应
@array2=(5,6)
unshift(@array2,8)
# array2 = (8,5,6)
unshift(@array2,1..5)
# array2 = (1,2,3,4,5,8,5,6)
特殊索引值
-
$#<数组名>
代表最后元素的索引值
@array=("Hello","World",1..99,qw/Long string/, 2..16)
# 共118个元素
$end=$#array
# 117 -
负数索引
$array[-1]
# 最后一个元素
3.引用
- 引用,作为一种数据变量,可以指向变量、数组甚至子程序,存储值的地址
- 在Perl中,可以把引用成为指针,二者是通用的无差别的。
引用的方法
软引用
- 类似于软链接,存储一个变量的名字
$scalar="Hello"
@scalar=("Hello", "World",123)
## 通过引用变量名来引用变量
$refer="scalar"
- 软引用的解引用
$$refer # 类似于 $scalar
# 数组的引用
$$refer[0] # 类似于 $scalar[0]
软引用相当于替代变量名的过程
硬引用 (常用)
- 类似于硬链接,就是存储地址
$foo='hello';
# 通过引用地址来引用变量foo
$scalerref=\$foo;
# 常量引用
$constref=\186_282.42
# 数组引用
@arr=1..100
$arrayref=\@arr;
# 匿名数组的引用
$arrRef=[1,2,3,4,5];
- 硬引用的解引用
由于引用的是地址,所以用{}
来进行解引用
$foo='hello';
$scalerref=\$foo;
# 变量解引用
${$scalerref} # 简写 $$scalarref
$constref=\186_282.42
# 常量解引用
${$constref} # 简写 $$constref
@arr=1..100
$arrayref=\@arr;
# 数组解引用
${$arrayref}[0]
$arrRef=[1,2,3,4,5];
# 匿名数组的解引用
${$arrRef}[0]
- 引用有助于创建复杂数据,比如多维数组。
网友评论