Perl 基本语法 - 列表和数组
#!/usr/bin/env perl -w
$fred[0] = "yabba";
$fred[1] = "dabba";
$fred[2] = "doo";
print @fred;
#print @fred."\n";
qw 简写
qw ! fred barney betty wilma dino !
qw# fred barney betty wilma dino # #有些像注释
qw( fred barney betty wilma dino )
...
列表赋值
($fred, $barney, $dino) = ("flintstone", "rubble", undef);
($fred, $barney) = qw <flintstone rubble slate granite>; #两个值被忽略了
($rocks[0],$rocks[1],$rocks[2],$rocks[3]) = qw/talc mica feldspar quartz/;
当想引用这个数组时, Perl 有一种简单的写法。在数组名前加@(后没有中括号) 来引用整个数组。 你可以把他读作 "all of the "(所有的)”,所以@rocks 可以 读作 "all of the rocks(所有的石头)"。其在赋值运算符左右均有效:
@rocks = qw / bedrock slate lava /;
@tiny = (); #空表
@giant = 1..1e5; #包含 100,000 个元素的表
@stuff = (@giant, undef, @giant); #包含 200,001 个元素的表
@dino = "granite";
@quarry = (@rocks, "crushed rock", @tiny, $dino);
pop 和 push 操作
@array = 5..9;
$fred = pop(@array); #$fred 得到 9,@array 现在为(5,6,7,8)
$barney = pop @array; #$barney gets 8, @array 现在为(5,6,7)
pop @array; #@array 现在为(5,6)(7 被丢弃了)
push(@array,0); #@array 现在为(5,6,0)
push @array,8; #@array 现在为(5,6,0,8)
push @array,1..10; #@array 现在多了 10 个元素
@others =qw/9 0 2 1 0 /;
push @array,@others; #@array 现在又多了 5 个元素(共有 19 个)
shift 和 unshift 操作
push 和 pop 对数组的末尾进行操作(或者说数组右边有最大下标的元素,这依赖 于你是怎样思考的)。相应的, unshift 和 shift 对一个数组的开头进行操作(数 组的左端有最小下标的元素) 。下面是一些例子:
@array = qw# dino fred barney #;
$m = shift (@array); #$m 得到 "dino", @array 现在为 ("fred", "barney")
$n = shift @array; #$n 得到 "fred", @array 现在为 ("barney")
shift @array; #@array 现在为空
$o = shift @array; #$o 得到 undef, @arry 仍为空
unshift(@array,5); #@array 现在为(5)
unshift @array,4; #@array 现在为(4,5)
@others = 1..3;
unshift @array, @others; #array 现在为(1,2,3,4,5)
和 pop 类似,如果其数组变量为空,则返回 undef。
字符串中引用数组
和标量类似,数组也可以插入双引号的字符串中。插入的数组元素会自动由空格分 开:
@rocks = qw{ flintstone slate rubble };
print "quartz @rocks limestone\n"; #输出为 5 种 rocks 由空格分开
foreach 控制结构
foreach $rock (qw/ bedrock slate lava /) {
print "One rock is $rock.\n" ; #打印出 3 种 rocks
}
这里的$rock不是这些列表元素中的一个拷贝而是这些元素本身
最常用的默认变量 : $_
如果在 foreach 循环中省略了控制变量,那 Perl 会使用其默认的变量:$_。除了 其不寻常的名字外,这和普通变量类似,如下面代码所示:
foreach(1..10){ #使用默认的变量$_
print "I can count to $_!\n";
}
$_ = "Yabba dabba doo\n";
print; # 打印出默认变量 $_
reverse 操作
reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。
@fred = 6 .. 10;
@barney = reverse (@fred); #得到 10,9,8,7,6
@wilma = reverse 6 . .10; #同上,没有使用额外的数组
@fred = reverse @fred; #将逆转过的字符串存回去
sort 操作
@rocks = qw/ bedrock slate rubble granite /;
@sorted = sort(@rocks); #得到 bedrock, granite, rubble, slate
标量和列表上下文
42 + something #something 必须是标量
sort something #something 必须是列表
@people = qw( fred barney betty );
@sorted = sort @people; #列表内容: barney , betty, fred
$number = 42 + @people; #标量内容:42+3,得到 45
另一个例子是 reverse。在列表 context 中,它返回反转的列表。在标量 context 中,返回反转的字符串(或者将反转的结果串成一个字符串):
@backwards = reverse qw / yabba dabba doo /;
#返回 doo, dabba, yabba
$backwards = reverse qw/ yabba dabba doo /;
#返回 oodabbadabbay
在列表 Context 中使用 Scalar-Producing 表达式
如果一个表达式不是列表值,则标量值自动转换为一个元素的列表:
@fred = 6*7;
@barney = "hello" . '' . "world";
强制转换为标量 Context
偶尔,你可能需要标量 context 而 Perl 期望的是列表。这种情况下,可以使用函数 scalar。它不是一个真实的函数因为其仅是告诉 Perl 提供一个标量 context:
@rocks = qw(talc quartz jade obsidian);
print "How many rocks do you have?\n;
print "I have " @rocks, "rocks!\n"; # 错误,输出 rocks 的名字
print "I have " scalar @rocks, "rocks!\n; # 正确,输出其数字
<STDIN> 在列表 Context 中
@lines = <STDIN>; #将输入读入列表 context 中
chomp (@lines = <STDIN>); #读入所有的行,不包括换行符
上一篇: 查找字符串中的所有字母反义词
下一篇: 巴别 7.24.0 已发布!
推荐阅读
-
AngularJS 生命周期和基本语法
-
Damon 数据库与 MySQL 的常见语句和区别 - 区别:Damon 和 MySQL 添加列的语法基本相同。
-
Verilog 基本语法 - 参数、局部参数和 `define- I. 局部参数
-
VScode 安装和使用 - ECMAScript 6 基本语法 - Vue 基本语法 - axios - Node.js 简介
-
Python 基本语法 - for 循环和 while 循环
-
ACM 基本算法入门和主题列表
-
GO 语言入门指南:基本语法和常用功能说明(数据类型) | YTCA
-
java 数组和集合框架 (II) - 集合框架, 迭代器 iterator, 列表
-
Fortran 语言基本语法-e、输入和输出结构:
-
java8:数组列表和向量的实现原理 - 摘要