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

先到這里,明天繼續更。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 53.計算字符 在字符串中獲取字符值的數量, 可以使用字符串字符屬性中的計數屬性: let unusualMena...
    無灃閱讀 1,140評論 0 4
  • 2010 第二天:用main函數控制命令行交互 2010 年 Perl6 圣誕月歷(二)用 main 函數控制命令...
    焉知非魚閱讀 507評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 每個人心目中對愛人的標準不一樣,但有句話說得好,你首先得知道自己喜歡什么樣的愛人,才能按此標準找到心儀的愛人。...
    生虎日記閱讀 565評論 0 0
  • 第一章:有目的的練習 史蒂夫的超強記憶力。 史蒂夫·法隆,是一名普通大學生。作者安德斯?艾利克森招聘他參加記憶力訓...
    Lancy日記閱讀 974評論 0 0