第三章 Perl6变量(Variables)

作者: 暂时是E0 | 来源:发表于2016-03-12 22:19 被阅读62次

    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

    先到这里,明天继续更。

    相关文章

      网友评论

      本文标题:第三章 Perl6变量(Variables)

      本文链接:https://www.haomeiwen.com/subject/fpitlttx.html