第三章 Perl6变量(Variables)

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 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

先到这里,明天继续更。

你可能感兴趣的:(第三章 Perl6变量(Variables))