perl学习-day3-Perl 数组、哈希

1.2 数组

1.2.4 切割数组

跟python 的列表一致,指定有效的索引值切割,可以用逗号分割,如果是连续的索引,可以用.. 来表示指定范围

@sites2 = @sites[3,4,5];
@sites2 = @sites[3..5];

1.2.5 替换数组元素

数组元素替换用splice()函数
splice(@nums, 5, 4, 21..24);
指第5位元素(从1开始数)替换4个元素,新的元素为21到24

1.2.6 将字符串转换为数组

类似python中的字符串转换为列表,用split()函数

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

参数说明:
PATTERN:分隔符,默认为空格。
EXPR:指定字符串数。
LIMIT:如果指定该参数,则返回该数组的元素个数。(一开始对于这个参数不是很理解,测试之后发现,这个参数为数字,这个数字表示你希望返回数组的元素是几个,如果不给该参数,则不限制)

#!/usr/bin/perl 
# 定义字符串
$var_test = "runoob";
# 字符串转为数组
@test = split('', $var_test);
@test1 = split('', $var_test, 3);
@test2 = split('', $var_test, 4);
print "@test\n";  # 输出 数组
print "@test1\n";  # 输出 数组
print "@test2\n";  # 输出 数组

执行以上程序,输出结果为:

r u n o o b
r u noob
r u n oob

1.2.7 将数组转换为字符串

跟python的列表转换为字符串一样,
$string2 = join( ',', @names );

1.2.8 数组排序

跟python列表排序一致
@sites = sort(@sites);
注意:数组排序是根据 ASCII 数字值来排序。所以我们在对数组进行排序时最好先将每个元素转换为小写后再排序。

1.2.9 合并数组

数组的元素是以逗号来分割,我们也可以使用逗号来合并数组,如下所示:

实例

#!/usr/bin/perl
@numbers1 = (1,3,(4,5,6));
@odd = (1,3,5);
@even = (2, 4, 6);
@numbers2 = (@odd, @even);
print "numbers = @numbers1\n";
print "numbers = @numbers2\n";

执行以上程序,输出结果为:

numbers1 = 1 3 4 5 6
numbers = 1 3 5 2 4 6

1.3 哈希

哈希 % 开始,哈希是一个key/values 对的集合,访问哈希元素格式:${key}。

%data = ('google', 45, 'runoob', 30, 'taobao', 40);
print "\$data{'google'} = $data{'google'}\n";

输出结果为:

$data{'google'} = 45

这里可以看出跟python中的字典类似。

1.3.1 创建哈希

#!/usr/bin/perl
$data{'google'} = 'google.com';  #一、为每个 key 设置 value
%data = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com'); #二、通过列表设置 ,列表中第一个元素为 key,第二个为 value。
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com'); #也可以使用 => 符号来设置 key/value
%data = (-google=>'google.com', -runoob=>'runoob.com', -taobao=>'taobao.com'); #使用 - 来代替引号,使用这种方式 key 不能出现空格,读取元素方式为:
$val = $data{-google}
$val = $data{-runoob}

1.3.2 读取哈希值

你可以像数组一样从哈希中提取值。
哈希值提取到数组语法格式:@{key1,key2}。

实例

#!/uer/bin/perl
%data = (-taobao => 45, -google => 30, -runoob => 40); 
@array = @data{-taobao, -runoob}; #从哈希中提取值
print "Array : @array\n"; 
@names = keys %data;#读取所有key, keys %HASH, 该函数返回所有哈希的所有 key 的数组。
print "@names\n";
@urls = values %data;  #values %HASH,该函数返回所有哈希的所有 value 的数组。
print "@urls\n"; 

执行以上程序,输出结果为:

Array : 45 40
-google -taobao -runoob
30 45 40

1.3.3 检测元素是否存在

如果你在哈希中读取不存在的 key/value 对 ,会返回 undefined 值,且在执行时会有警告提醒。
为了避免这种情况,我们可以使用 exists 函数来判断key是否存在,存在的时候读取:
实例

#!/usr/bin/perl
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
if( exists($data{'facebook'} ) ){
   print "facebook 的网址为 $data{'facebook'} \n";
}
else
{
   print "facebook 键不存在\n";
}

执行以上程序,输出结果为:

facebook 键不存在

1.3.4 获取哈希大小与哈希中添加或删除元素

哈希大小为元素的个数,我们可以通过先获取 key 或 value 的所有元素数组,再计算数组元素多少来获取哈希的大小,添加 key/value 对可以通过简单的赋值来完成。但是删除哈希元素你需要使用 delete 函数,实例如下:

#!/usr/bin/perl
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
@keys = keys %data;
$size = @keys;
print "1 - 哈希大小: $size\n";
@values = values %data;
$size = @values;
print "2 - 哈希大小: $size\n";
# 添加元素
$data{'facebook'} = 'facebook.com';
@keys = keys %data;
$size = @keys;
print "3 - 哈希大小: $size\n";
# 删除哈希中的元素
delete $data{'taobao'};
@keys = keys %data;
$size = @keys;
print "4 - 哈希大小: $size\n";

执行以上程序,输出结果为:

1 - 哈希大小: 3
2 - 哈希大小: 3
3 - 哈希大小: 4
4 - 哈希大小: 3

1.4 变量的上下文

perl 为每个变量类型设置了独立的命令空间,所以不同类型的变量可以使用相同的名称,不用担心冲突。
所谓上下文:指的是表达式所在的位置。
举例如下:

#!/usr/bin/perl 
@names = ('google', 'runoob', 'taobao');
@copy = @names;   # 复制数组
$size = @names;   # 数组赋值给标量,返回数组元素个数
print "名字为 : @copy\n";
print "名字数为 : $size\n";

以上程序执行输出结果为:

名字为 : google runoob taobao
名字数为 : 3

代码中 @names 是一个数组,它应用在了两个不同的上下文中。第一个将其复制给另外一个数组,所以它输出了数组的所有元素。第二个我们将数组赋值给一个标量,它返回了数组的元素个数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容