第三章 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>;

输出

(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

先到这里,明天继续更。

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

推荐阅读更多精彩内容

  • 53.计算字符 在字符串中获取字符值的数量, 可以使用字符串字符属性中的计数属性: let unusualMena...
    无沣阅读 1,065评论 0 4
  • 2010 第二天:用main函数控制命令行交互 2010 年 Perl6 圣诞月历(二)用 main 函数控制命令...
    焉知非鱼阅读 463评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 每个人心目中对爱人的标准不一样,但有句话说得好,你首先得知道自己喜欢什么样的爱人,才能按此标准找到心仪的爱人。...
    生虎日记阅读 516评论 0 0
  • 第一章:有目的的练习 史蒂夫的超强记忆力。 史蒂夫·法隆,是一名普通大学生。作者安德斯•艾利克森招聘他参加记忆力训...
    Lancy日记阅读 907评论 0 0