3 变量
Perl 6 的变量可以分为三类:标量(scalars)、数组(arrays)和哈希(hashes)。
相对应的有三种标记方式,我们称之为魔符(sigil),是取自拉丁文的三个符号
. $用于表示标量;
. @用于表示数组;
. %用于表示哈希。
3.1 标量
一个标量变量只拥有一个值或者引用(未定义的变量取值为undef)。
#字符串标量
my $name = 'John Doe';
say $name;
#整型标量
my $age = 20;
say $age;
对于一个标量可以进行一系列专一性的操作,取决去该标量所取得值。
字符串
my $name = 'John Doe';
say $name.uc;
say $name.chars;
say $name.flip;
JOHN DOE
8
eoD nhoJ
若需完整的关于字符串操作的方法,请移步(http://doc.perl6.org/type/Str)
整型
my $age = 17;
say $age.is-prime;
True
若需完整的关于字符串操作的方法,请移步(http://doc.perl6.org/type/Int)
有理数型
my $age = 2.3;
say $age.numerator;
say $age.denominator;
say $age.nude;
23
10
(23 10)
若需完整的关于字符串操作的方法,请移步(http://doc.perl6.org/type/Rat)
3.2 数组
数组就是包含多个值的多个列表(数组可以包含多个列表,一个列表可以包含多个值)。
my @animals = 'camel','llama','owl';
say @animals;
下述例子中展示了众多可以对数组进行的操作(波浪字符~
用于字符串连接):
脚本
my @animals = 'camel','vicuña','llama';
say "The zoo contains " ~ @animals.elems ~ " animals";
say "The animals are: " ~ @animals;
say "I will adopt an owl for the zoo";
@animals.push("owl");
say "Now my zoo has: " ~ @animals;
say "The first animal we adopted was the " ~ @animals[0];
@animals.pop;
say "Unfortunately the owl got away and we're left with: " ~ @animals;
say "We're closing the zoo and keeping one animal only";
say "We're going to let go: " ~ @animals.splice(1,2) ~ " and keep the " ~ @animals;
输出
The zoo contains 3 animals
The animals are: camel vicuña llama
I will adopt an owl for the zoo
Now my zoo has: camel vicuña llama owl
The first animal we adopted was the camel
Unfortunately the owl got away and we're left with: camel vicuña llama
We're closing the zoo and keeping one animal only
We're going to let go: vicuña llama and keep the camel
注释
.elems
将返回数组中的元素个数;
.push()
用于往数组中添加一个元素;
@animals[0]
中括号中数值可以表示数组的具体位置;
.pop
将数组中末尾元素移除;
.splice(a,b)
可以将从a开始数的第b个元素移除。
3.2.1 固定规模的数组
一个基础的数组可由下句来声明:
my @array;
基础数组也可以含有不限定的长度,也即所谓的自动调整;
数组能够接受任意数目的值且没有限制;
相反,我们也可以创建固定大小的数组;
这些数组则在超出其最大容量时便无法使用;
声明固定规模的数组方式很简单,只要在数组名后面的中括号里说明元素数目的上限即可:
my @array[3];
该数组可以最多含有三个元素,索引值从0到。
my @array[3];
@array[0] = "No.1元素";
@array[1] = "No.2元素";
@array[2] = "No.3元素";
如以下赋值方式是行不通的:
my @array[3];
@array[0] = "No.1元素";
@array[1] = "No.2元素";
@array[2] = "No.3元素";
@array[3] = "No.4元素";
该脚本执行会得到报错:
索引值3超出了范围(0-2)
3.2.2 多维数组
我们现在为止所见到的数组都是一维数组,幸运的是,我们在Perl6中还可以定义多维数组:
my @tbl[3;2];
这是一个二维数组,第一个维度可以最多含有3个元素,第二个维度可以最多含有2个元素。
my @tbl[3;2];
@tbl[0;0] = 1;
@tbl[0;1] = "x";@tbl[1;0] = 2;
@tbl[1;1] = "y";
@tbl[2;0] = 3;
@tbl[2;1] = "z";
say @tbl
若需要完整的关于数组的说明,请移步(http://doc.perl6.org/type/Array)
3.3 哈希
一个哈希,就是一组(可以理解为多个)键-值对儿。
my %capitals = ('UK','London','Germany,'Berlin');
say %capitals;
另一种为哈希填充的方式如下:
my %capitals = ('UK' => 'London','Germany => 'Berlin');
say %capitals;
可以对哈希进行的一些操作举例:
脚本
my %capitals = ('UK' => 'London','Germany => 'Berlin');
%capitals.push: (France => 'Paris');
say %capitals.kv;
say %capitals.keys;
say %capitals.values;
say "The capital of France is: " ~ %capitals<France>;
输出
(France Paris Germany Berlin UK London)
(France Germany UK)
(Paris Berlin London)
The capital of France is: Paris
注释
.push: (键 => '值')
用来添加新的键值对;
.kv
返回一个包含所有键和值的列表;
.keys
返回一个包含所有键的列表;
.values
返回一个包含所有值的列表。
若需要完整的关于哈希的介绍,请移步:(http://doc.perl6.org/type/Hash)
3.4 类型
在之前的例子中,我们并没有明确变量应该取哪些类型的值。
Tips: .WHAT 会返回变量取值的类型。
my $var = 'Text';
say $var;
say $var.WHAT;
$var = 123;
say $var;
say $var.WHAT;
上述例子中,var
的值的类型先是字符串,后是整型。
这种类型的变成称为动态分型,也即变量可能取任何类型的值。
现在运行下述的脚本,同时注意在变量名前的Int
:
my Int $var = 'Text';
say $var;
say $var.WHAT;
该脚本会执行失败并返回错误提示:Type check failed in assignment to $var; expected Int but got Str(检验$var的类型失败,因为与期望的整型不同)
在该过程中,我们首先指定了变量$var
的类型为整型(Int),所以当我们试图指派一个字符串型(Str)时,执行失败。
这种编程成为静态类型,静态是指变量类型在赋值前已经指定并且不能更改。
Perl6 被归类为一种过渡类型语言,既认可动态分类也认可静态分类。
数组跟哈希也能被静态分类
my Int @array = 1,2,3;
say @array;
say @array.WHAT;
my Str @multilingual = "Hello","Salut","Hallo","您好","안녕하세요","こんにちは";
say @multilingual;
say @multilingual.WHAT;
my Str %capitals = (UK => 'London', Germany => 'Berlin');
say %capitals;
say %capitals.WHAT;
my Int %country-codes = (UK => 44, Germany => 49);
say %country-codes;
say %country-codes.WHAT;
下表给出的是最常用的几种类型:
前两种你可能永远都不会用上,但还是列出以为信息拓展。
类型 | 描述 | 举例 | 结果 |
---|---|---|---|
Mu | Perl6 类型层次的根 | ||
Any | 对新类和大多数内建类的默认设置类型 | ||
Cool | 能可替换的被当成字符串或数值对待的值 | my Cool $var = 31; say $var.flip; say $var * 2; |
13 62 |
Str | 字符串 |
my Str $var = "NEON"; say $var.flip;
|
NOEN |
Int | 整数型(任意精度) | 7+7 |
14 |
Rat | 小数型(有限精度) | 0.1+0.2 |
0.3 |
Bool | 布尔值 | !True |
False |
先到这里,明天继续更。