Perl 6 是什么盼砍?
Perl 6 是一種逐漸演進的通用的多用途高級語言碾盟。Perl 6 是多范式的,它支持過程編程锄俄,面向?qū)ο缶幊毯秃瘮?shù)式編程。
Perl 6 的座右銘:
·TMTOWTDI:There is more than one way to do it.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 做一種事不只有一種方法
·簡單的事情就應該是簡單的勺拣,困難的事情應該變得簡單奶赠,不可能的事情變成困難的事。(Easy things should stay easy, hard things should get easier, and impossible things should get hard.)
Perl 6 術語
Perl 6: 是一種帶有測試套件的語言規(guī)范药有,通過該測試套件實現(xiàn)的執(zhí)行程序可以被認為是Perl 6毅戈。
Rakudo:Perl 6 的編譯器。
Rakudobrew:Rakudo的安裝管理器愤惰。
Panda:Perl 6 的模塊安裝程序苇经。
Rakudo Star:包含Rakudo、Panda宦言、一攬子Perl 6 模塊和文檔的一個文件集扇单。
安裝Perl 6
Linux
1.安裝Rakudobrew:https://github.com/tadzik/rakudobrew
2.安裝Rakudo:在終端上輸入命令
Rakudobrew buildmoar
3.安裝Panda:在終端輸入命令
Rakudobrew build-panda
OSX
跟Linux中的安裝步驟基本相同。
或者安裝homebrew:
brew install rakudo-star
Windows
1.下載最新版本的安裝程序(帶有.MSI擴展名的文件)奠旺,32位系統(tǒng)請下載x86文件蜘澜,64位系統(tǒng)請下載x86——64文件:http://rakudo.org/downloads/star/ ? ? ? ? ? ? ? ? ? ?
2.安裝完成后添加C:\rakudo\bin到PATH中
Docker
1.獲取官方Docker鏡像文件
docker pull rakudo-star
2.使用該鏡像運行一個容器
docker run -it rakudo-star
運行Perl6代碼
Perl 6 的代碼運行可以通過使用REPL(Read-Eval-Print Loop)來實現(xiàn)。實現(xiàn)方法是响疚,打開命令行終端鄙信,輸入perl6后回車。操作結(jié)束后會在下一行出現(xiàn)命令提示符“>”忿晕。輸入一行代碼后回車装诡,REPL將會輸出該行的返回值。循環(huán)該操作可以繼續(xù)執(zhí)行下一行代碼践盼。輸入exit并回車可以離開REPL鸦采。
或者,你可以在文件中編寫你的代碼咕幻,保存后再運行赖淤。建議Perl 6 腳本文件的擴展名設定為“.pl6"。運行該文件的代碼時只需將該文件的文件名“perl6filename.pl6”輸入到命令行終端后回車即可谅河。但不像REPL可以直接自動輸出每一行的結(jié)果咱旱,這里要求文件中的代碼必須包含“say”等聲明才能輸出結(jié)果。
REPL大多用于測試特殊的一塊代碼绷耍,慣常是僅有一行吐限。對于超過一行代碼的程序,建議還是先保存在文件中而后運行褂始。
單行代碼也可以非交互的直接在命令行上測試诸典。方法如下:
perl6 -e '你的代碼'
回車
溫馨提示:
Rakudo star捆綁了一個能幫你從REPL中獲取最多的行編輯器。
如果你安裝單一的Rakudo而不是Rakudo Star崎苗,你可能不會擁有可供使用的行編輯(利用上下方向鍵查詢歷史狐粱;左右方向鍵以編輯輸入舀寓;TAB鍵以完成當前行輸入)功能予借。此時可以考慮運行以下命令王带,可以設置好上述功能:
panda install Linenoise ? ? ? ? ? ?#Windows,linux,OSX
panda install Readline ? ? ? ? ? ? #在你使用Linux并且偏愛Readline庫時
編輯器
上述到大多數(shù)情況下我們會將Perl 6程序代碼編寫并保存到文件中,因此我們需要一個優(yōu)雅的而且能夠識別并支持Perl 6語法的文本編輯器缤谎。
從個人角度來說蒋搜,我推薦正在使用的Atom篡撵。這是一個時尚的文本編輯器,能將Perl 6的語法從框中高亮的表示出來豆挽。Perl6-fe是相對于Atom的另一種選擇育谬,也可以高亮Perl 6的語法,該軟件來源于原始的包帮哈,但存在很多bug需要修補和編輯膛檀。
社區(qū)里的其他同伴也有使用Vim ,Emacs 和Padre的娘侍。
最新版本的Vim裝有高亮語法的功能宿刮,Emacs和Padre則需要另行安裝額外的包。
Hello World私蕾!
我們可以從經(jīng)典的hello world開始開始Perl 6之旅了
say 'hello world';
也可以寫成這樣:
'hello world' .say;
語法概覽
Perl 6 是形式自由的僵缺。大多數(shù)情況下,你可以使用任意數(shù)目的空格符踩叭。
Perl 6 語句(statement)通常是一行有邏輯的代碼磕潮,一般需要以分號(;)結(jié)尾,例如
say "Hello" if True;
表達式(expression)是一種特殊類型的語句容贝,它將返回執(zhí)行后的值(value)自脯,例如
1+2 ? ? ? ? ? ? ? ? ? #返回3
表達式由項和運算符組成。
項有:
·變量(variables):可以被操作和改變的值斤富。
·常量(literals):不發(fā)生變化的值膏潮,例如一個數(shù)字或字符串。
運算符分類:
| ? ? ? ? ? ? ? ? ? ? 類型 ? ? ? ? ? ? ? ? ? | ? ? ? ? ? ? ? ? ? 說明 ? ? ? ? ? ? ? ? ? | ? ? ?舉例 ? ? |
|前綴(prefix) ? ? ? ? ? ? ? ? ? ? ? ?| 在項之前 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? ? ? ? ? ++1|
|中綴(infix) ? ? ? ? ? ? ? ? ? ? ? ? ?|在項之間 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ? ? ? ? 1+2|
|后綴(postfix) ? ? ? ? ? ? ? ? ? ? ?|在項之后 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? ? ? ? ? 1++|
|環(huán)綴(circumfix) ? ? ? ? ? ? ? ? ?|包圍項 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? (1)|
|后環(huán)綴(postcircumfix) ? ? ? ?|在一項的后面并且包圍另一項 ? ?| ? ?Array[1]|
標識符
標識符是你在定義項時起得名字满力。
規(guī)則:
·標識符必須以下劃線或者字母開頭焕参。
·可以包含數(shù)字,但不能以數(shù)字開頭油额。
·除開頭和末尾叠纷,且右側(cè)是字母時,中間可以包含連接符和省略福潦嘶。
|合法標識符| ? ?|不合法標識符|
|var1 ? ? ? ? | ? ? |1var ? ? ? ? ? ?|
|var-one ? | ? ? |var-1 ? ? ? ? ?|
|var'one ? ?| ? ? |var'1 ? ? ? ? ? |
|var1_ ? ? ? | ? ? |var1' ? ? ? ? ? |
|_var ? ? ? ? | ? ? |-var ? ? ? ? ? ?|
命名規(guī)范
·Camel case:variableNo1
·Kebab case:variable-no1
·Snake case :variable_no1
你可以自由選擇喜歡的方式來命名你的標識符涩嚣,但采用上述其中一種規(guī)范來進行一致性的命名,不失為一種好習慣。
采用具有特定表意的名稱會讓你(當然也有別人)的編程生活更舒適航厚!
·var1 = var2 * var3 ? ? #標識符語法正確顷歌,但含義不明顯
·monthly-salary = daily-rate * working-days ? ?#這會是一種更好的變量命名方式
注釋
注釋是用以當做備忘的,在執(zhí)行過程中被編譯器忽略的一段文字幔睬。
注釋可以分為三種類型:
·單獨行注釋(single line):
# This is a single line comment
·語句中的注釋(embedded):
say # `(This is an embedded comment) "Hello World."
·多行注釋(Multi line):
=begin comment
This is a multi line comment.
Comment 1
Comment 2
=end comment
引用
字符串需要使用雙引號("")或者單引號('')來進行定界眯漩。
以下情況一直采用雙引號:
·你的字符串包含撇號(')
·你的字符串中包含需要進行值內(nèi)插的變量
say 'Hello World'; ? ? ? ? ? ? ? #Hello ?World
say "Hello World"; ? ? ? ? ? ? ?#Hello ?World
say "Don't"; ? ? ? ? ? ? ? ? ? ? ? ?#Don't
my $name = 'John Doe';
say 'Hello $name'; ? ? ? ? ? ? ?#Hello ?$name
say "Hello $name"; ? ? ? ? ? ? ?#Hello ?John Doe