perl6學習

gaorongchao1990626發表於2013-05-19


1 寫在perl6之前

從95年到現在,很多年過去了,從perl6計劃開始到現在,也有10年的時間了。 所有的事物都在不斷的發展,或許perl6還要再開發10年,或者20年,但是未來 總是屬於perl6的。與其等到40歲的時候再去學習一項新的東西,不如從現在開 始就積極擁抱perl6。

2 perl6的安裝

perl6的官方網站:perl6.org。上面有perl6相關的東西。其中Compilers 是Rakudo,也就是perl6的編譯器。我們從這裡面可以得到具體的安裝資訊。我 所有的工作都是在Ubuntu下進行的。在rakudo.org裡面我們可以下載。或者我 們可以用git來進行安裝。在下載下來的rakudo中有一個install的檔案,這裡 包含了安裝rakudo所需要的東西,和安裝的資訊,裡面用Ubuntu作為例子,你 可以根據這個來進行安裝。 安裝完成以後,修改一下環境變數,vim .bashrc,然後新增perl6所在的目錄 就可以了。

3 學習perl6

我看的第一份資料是是從perl6.org/documentation/ 裡下載的Perl 5 to perl 6.還有doc.perl6.org裡面的的東西。 首先perl6中不用use strict;和use warnings;了,用了反而會報錯。

3.1 字串

用法

1:  my $fve = 5;
2:  print "an interpolating string, just like in perl $five\n";
3:  say 'say() adds a newline to the output,just like in perl 5.10';
4:  say 'new line with out \n";
5:  #這裡的一個新的特性就是,say自動新增換行符。不用你手動加入了

貌似雙引號的功能也有所改變,但是怎麼改變的還沒有具體的看到。
字串被雙引號包括(變數內插)或者用單引號,反斜槓和perl5一樣。 變數內插的規則有了一些變化,下面的情況將被變數內插

1:  my $scalar = 6;
2:  my @array =1,2,3;
3:  say "Perl $scalar";
4:  say "An @array[]";     #空索引,結果是整個陣列,1,2,3
5:  say "@array[1]";
6:  say "Code:{$scalar*2}";#大括號中的部分會被看成程式碼,結果是內插的,結果是12

陣列和hash只有在後面跟著索引的時候,或者跟著以()結尾的方法的時候才會變數內插。 如”some $obj.method()"),空的索引內插整個hash或者陣列。

3.2 陣列

陣列相關新方法

1:  @array.keys();       #取得陣列的下標
2:  @array.values();     #取得陣列的值
3:  @array.kv();         #下標和值一起取得
4:  @array.elems();      #元素的個數
5:  @array.exists(num); #判斷某個下標值是否存在,
6:  @array.max();       #最大值
7:  @array.min();       #最小值
1:  my @array = 1,2,3,'foo';        #括號不再需要
2:  my $sum = @array[0]+@array[1];  #單個陣列元素也是以@開頭
3:  my @array[1,3];                 #陣列切片仍然可用
4:  my $num_of_element = @array.elems;
5:  #元素的個數,在perl6中通過這種方式,而不是各種奇怪的符號,
6:  my $num_of_element = +@array  #是求元素個數的另外一種方法。
7:  my $last_item = @array[*-1];  #陣列的最後一個元素
8:  
1:  @array.pick(num);   #隨機取出陣列中的不重複元素
2:  #例子
3:  my @array = <a b c d e>;
4:  say @array.pick(4);
5:  say @array.pick(*);#*代表所有元素

所有的都是物件,你可以call mechods on arrays;

 1:    my @array = <5 7 3 6>;
 2:  ' #以前這樣寫@array = qw/5 7 3 6/;現在可以按照上面的方法寫
 3:    my @b = @a.sort; #對@array使用方法“排序”
 4:    say @b;          #結果為3 5 6 7
 5:    say @b.elems;    #陣列元素,結果為4
 6:    if @b > 2 {say “yes”}
 7:    say @b.end;      #最後一個元素的下標,結果為3
 8:    my @c = @b.map ({$_*2});
 9:    say @c;         #結果為6 10 12 14
10:    

3.3 hash

1:  my %drinks =
2:      France  => 'Wine',
3:      Bavaria => 'Beer',
4:      USA     => 'Coke';
5:  say "The people in France love ",%drinks{'France'};
6:  my @countries = %drinks.keys.sort;
7:  #%drinks{'France'};現在的用法
8:  #$drinks{France};  以前的用法
9:  #%drinks<France>;  現在也可以這樣用

所有的內建方法,可以是method也可以是一個子程式,所以這兩種方法 都對,sort @array @array.sort.
最後你要知道,所有的[..] {..}(occurring direct after a term) 僅僅是在使用一個特定的方法,而不是和陣列和hash想相聯絡的。

1:  my $a = [1,2,3];
2:  say $a[2];      #3
3:  #this implies that you don't need special dereferencing syntax,and that you can
4:  #act as arrays, hashes and subs at the same time.沒整明白???

3.4 Types 型別

在perl6從都有型別,所有的東西都可以看成一個物件,都有一個型別。 變數也可以有一個型別的約束,但是不是必須需要一個型別。

 1:     'a string'  #str字串
 2:    2           #int整數型
 3:    3.14        #Rat (rational number)有理數
 4:    (1,2,3)   #Seq列表
 5:  #所有的內建型別都是大寫字母開頭,所有的標準型別都是繼承了Any,並且所有的都繼承了Mu
 6:  
 7:  #你可以在宣告的時候,加上型別
 8:  my Numeric $x = 3,4;
 9:  my $Int @a 1,2,3;
10:  
11:  #對一個陣列型別的型別定義,作用在陣列的元素上,
12:  #Str @s  @s這個陣列只能夠包含字串元素的陣列
13:  
14:  #一些型別是隸屬與一個大的分類,比如:整數型(Int),有理數(Rat),浮點型(Num)都是屬於
15:  #Numeric這個大的型別
16:  
17:  #要知道一個物件的型別,可以使用.WHAT的方法
18:  say "foo".WHAT;
19:  #如果你要確定一個特殊型別的方法,還有一個方法,
20:  if $x ~~ Int
21:  {
22:      say 'Variable $x contains an integer';
23:  }

我們需要型別的原因
1.程式設計更加安全
如果你宣告瞭一個特殊的型別,那麼你可以執行特定的某種操作,而不用檢查
2.可優化的
如果在編譯的時候提供了型別,那麼執行的程式會有明顯的優化。在原則上perl6 不會比C慢
3.可擴充套件型
有了型別資訊和多重的操作路徑,你可以很容易對特定的型別改善操作

3.5 基本的控制結構

perl6 和perl5 的控制結構基本相同,最大的不同是你不必在if,while,for等,後面新增 小括號了。事實上所有的標示符後面緊跟著小括號,都會被看成在呼叫子程式一個名稱為if的子 程式,for後面加一個空格,可以改善這種情況,但是直接省略括號更加安全。
if控制結構

1:  #if結構是變化最小的,你依然可以用elsif和else,unless也還在,但是在unless後面不允許else
2:  #分支結構
3:  if $sheep == 0 {say "how boring";}
4:  elsif $sheep ==1 {say "one lonely sheep";}
5:  else {say "a herd,How lovely!";}
6:  
7:  #你依然可以這樣用
8:  say "you won" if $answer == 42;

Loops

 1:  for 1..100 -> $x
 2:  {
 3:      say $x;#會輸出1 2 3 。。
 4:  }
 5:  #->$x{..}被稱為‘pointy block'如同匿名子程式或者lisp中的lambda
 6:  #也可以有不止一個的迴圈變數
 7:  for 0..5 ->$even,$odd
 8:  {
 9:      say "Even: $even \t Odd: $odd";
10:  }
11:  #結果如下:
12:  #Event:1     Odd:2
13:  #也就是交替出現
14:  
15:  #這個也是hash的迭代的方法
16:  my %hash=
17:      a   => 1,
18:      b   => 2,
19:      c   => 3;
20:  for %hash.kv -> $key,$value
21:  {
22:      say "$key: $value";
23:  }
24:  
25:  #C-風格的for迴圈
26:  loop (my $x=1;$x<100;$x**2)
27:  {
28:      say $x;
29:  }

Author: GRC <grc@grc>

Date: 2013-05-19 14:55:01 CST

HTML generated by org-mode 6.33x in emacs 23

相關文章