Perl学习笔记2_标量数组哈希

发布时间 2023-07-15 16:37:42作者: 编程驴子

1. 概述

Perl是弱类型语言, 变量不需要指定类型, 解释器根据上下文自动选择匹配类型.
Perl有三个基本的数据类型: 标量($), 数组(@), 哈希(%).

2. 标量, scalar

标量变量以$标记.

my $a = 123; #数字
my $b = "123"; #字符串

my $c = 0x1F; #16进制
my $d = 047 ; #8进制

my $e = 11.4; #浮点数
my $f = 54.1e+2; #科学计数

标量运算

my $str0 = "hello" . " world"; #字符串拼接
my $str1 = "hello" x 3; #字符重复, hellohellohello, 注意是x不是*.

3. 数组, array

数组变量以@标记

my @a = (20, 30, "xx");
print("$a[0]\n"); #取数组元素, 使用正索引
print("$a[-1]\n"); #取数组元素, 使用负索引

my @b = qw/xx yy zz/; # 省略元素引号/逗号

my @c = (10 .. 20); # 起始值 .. 结束值, 表示10到20的所有元素
my @d = ('a' .. 'f'); # 表示 a到f的所有字母

#遍历数组
foreach my $v (@d){
    print("$v\n");
}

my $e = scalar @d; #数组长度
my $f = $#d ; #数组的最大index.


my $var = "abc";
my @var = ("abc", "def");
push(@d, $var); #向@d末尾添加一个元素
push(@d, @var); #向@d末尾添加多个元素
my $g = shift @d; #弹出@d的第一个元素, 并赋值给$g

my $h = pop @d; # 弹出@d的最后一个元素, 并赋值给$h
my $l = unshift(@d, $var); #把$var添加到@d开头, 并返回新数组长度

数组切片:

my @a = (0 .. 10);
my @b = @a[2, 4, 7]; # 取第2,4,7个元素组成新数组
my @c = @a[3 .. 6] ; # 取第3~6个元素

将str切分为数组: split
语法: split [PATTERN [, EXPR [, LIMIT]]]
PATTERN: 分隔符
EXPR: 待切分的字符串
LIMIT: 元素个数

my $s = "a b c d e fg hi jk";
my @a0 = split(/\s+/, $s); # a, b, c, d, e, fg, hi, jk, 长度为8的数组
my @a1 = split(/\s+/, $s, 3); # a, b, "c d e fg hi jk", 长度为3的数组

将数组元素连接为str: join
语法: join EXPR, LIST
EXPR: 连接符
LIST: 列表或数组

my @a0 = ('i' .. 'n'); # 字母 i到n
my $s0 = join('-', @a0); # i-j-k-l-m-n

数组排序:
sort [subroutine] LIST;

数组合并:

my @a0 = (1, 3, 5);
my @a1 = (2, 4, 6);

my @b0 = (@a0, @a1); # 1 3 5 2 4 6

4. 哈希, hash

my %data0 = (
    "a", "aaa",
    "b", "bbb",
    "c", "ccc",
    "d", "ddd",
);

my %data1 = (
    a => "aaa", # 使用=>时, key不能带空格
    b => "bbb",
    c => "ccc",
    d => "ddd",
);

print("$data0{a}\n");

#遍历hash
foreach my $k (keys %data0) {
    my $v = $data0{$k};
    print("$k $v\n");
}

while(my ($k, $v) = each %data1) {
    print("$k $v\n");
}

#判断key存在
if (exists $data1{"a"}){
    print("key a exists\n");
}

#添加元素
$data0{"e"} = "eee";

#删除元素
delete $data0{"e"};