- Perl 6 document - 翻譯
原文html
函數
一個全面的(但願如此)Perl 5內建函數在 Perl 6中的等價物列表,並在必要時記錄他們的差別。node
我將不會詳細的解釋函數,本文檔只是嘗試引導你從 Perl 5 的 perlfunc 文檔過渡到他們在 Perl 6的等價物,若是想了解 Perl 6函數的完整文檔,請參閱 Perl 6文檔。
一個通常意見是:Perl 6比 Perl 5 更加面向對象,在 Perl 6中,全部東西都是對象,然而若是你不想這麼作的話,語言足夠靈活到不強制你工做在面向對象風格。意思就是,無論怎樣,有不少函數調用由function(@args)
風格變爲了如今的@args.function
風格(罕見狀況下,僅有方法調用),這在下面的正文中會很顯然,不過這可讓更快的進入意境。
還有,除非另有說明,「function」一詞意思就是一個func(@args)
風格的函數,同時「method」一詞表明一個@args.func
風格的函數。正則表達式
個人信息來自https://doc.perl6.org/,設計文檔用作補充,並由irc.freenode.org #perl6 頻道中的成員負責輸入(??)。算法
-X FILEHANDLE(文件句柄)shell
-X EXPR(表達式)數據庫
-X DIRHANDLE(目錄句柄)數組
-X服務器
對於文件測試 Perl 6給了你兩種選擇,你可使用智能匹配(~~
)或者調用對應的方法。
在 Perl 6中進行文件測試,你沒必要像傳統方式同樣須要打開一個文件句柄(固然你仍然可使用文件句柄),簡單的向文件名字後面追加.IO
便可。下面是使用智能匹配檢測一個文件是否可讀的示例:併發
'/path/to/file'.IO ~~ :r
你仍然能夠利用一個已經打開的文件句柄完成測試,如今咱們有一個文件句柄$fh
,使用方法調用語法完成可讀性文件測試以下:app
$fh.r
大多數以前的文件測試都有和智能匹配一塊兒使用的帶冒號的版本:
:e Exists :d Directory :f File :l Symbolic link :r Readable :w Writeable :x Executable :s Size :z Zero size
全部這些測試也均可以做爲方法使用(不加冒號)。
下面的三種測試只有方法調用版本:
$fh.modified; # -M $fh $fh.accessed; # -A $fh $fh.changed; # -C $fh
Perl 5中其它的文件測試操做在還未在 Perl 6中實現。
關於文件測試的文檔能夠在這裏找到。
這裏有更多的關於讀寫文件的信息,還有下面的open()
小節對你也會有幫助。
abs VALUE(值)
能夠是一個函數(abs(x)
),也能夠是一個方法。然而有一個問題,方法綁定的優先級大於-
(負號),因此,-15.abs
將做爲-(15.abs)
求值,結果是-15
,在這種狀況下,你可能須要作相似與(-15).abs
的處理。
在缺乏一個值的時候,abs
能夠工做在$_
上面,可是不是一個函數,而是一個方法,你須要用.abs
替換比較簡單的abs
來調用它。
accept NEWSOCKET, GENERICSOCKET
accept
是一個你能夠在服務器端使用的方法,例如$server.accept()
,做爲原來封裝的地址返回值替代,它返回一個socket
,最有多是一個IO::Socket
對象。
alarm SECONDS
[須要進一步研究]已經沒有alarm()
了,有人建議用新的併發功能取代它,好比Promise.in
,可是爲了真正模擬它可能須要一些「挖掘」。
atan2 Y, X
便可以做爲函數又能夠做爲方法使用,下面的兩種方式是等價的:
atan2(100); 100.atan2;
bind SOCKET, NAME
[須要進一步研究]在 Perl 6沒有和 socket 相關函數bind()
簽名一致的函數,做爲一個猜測,socket 綁定在建立一個新的 socket 對象的時候完成。
binmode FILEHANDLE
做爲替代手段,你能夠在打開文件的時候使用:bin
文件模式,好比 my $fh = open('/path/to/file', :bin);
。
bless REF, CLASSNAME
由於 Perl 6中類的建立發生了改變,可能會比 Perl 5中更少被用到,如今它是一個方法也是一個函數。Perl 6文檔中說,它能夠建立一個和 invocant 類型同樣的新的對象,使用命名參數初始化屬性,而後返回建立的對象。若是你正在移植一個 Perl 5的模塊到 Perl 6,頗有可能你想使用new
來建立對象,而不是bless
,雖然有些狀況下,後者也會有用。
break
在 Perl 6中被移除,若是你想跳出given
塊結構,你可能須要看一下proceed
和succeed
,地址是這裏。
caller EXPR
[須要進一步研究]在 Perl 5中caller
已經被callframe
取代,一個簡單的callframe
調用不會有很大的用處,它不返回有用的信息,而是一個 CallFrame 對象。在 Perl 5中,文件名字和文件行數做爲caller
的第2、三個返回值返回,它們如今在callframe.annotations
裏面,你可使用callframe().annotations.<file line>
獲取他們,或者使用callframe().annotations.<file>
以及callframe().annotations.<line>
分別獲取。[??]然而,若是沒有callframe
,這並非一個獲取包名的簡單方式。
chdir EXPR
彷佛和 Perl 5中同樣。
chmod LIST
和 Perl 5中同樣是函數,只是8進制數的表示有些不大同樣(是0o755
而不是0755
),你也能夠把它做爲方法使用,好比$fh.chmod(0o755)
。
chomp VARIABLE
chomp
的行爲和 Perl 5中有些不一樣,它對目標不產生影響,而是返回一個去除邏輯換行符的新的目標,也就是$x = "howdyn"; $y = chomp($x);
,結果是$x
包含「howdyn」以及$y
包含「howdy」。一樣能夠做爲方法使用,也就是$y = $x.chomp
。
chop VARIABLE
和chomp
同樣,在 Perl 6中,它返回被短切之後的字符串,而不是直接短切替換,也就是$x = "howdy"; $y = chop($x);
,結果是$x
包含「howdy」以及$y
包含「howd」。一樣能夠做爲方法使用:$y = $x.chop
。
chown LIST
Perl 6中沒有chown
。
chr NUMBER
和 Perl 5的版本類似,把目標強制轉換成整數,而後做爲一個 Unicode code point 並返回相關的字符,能夠做爲函數或者方法使用:
chr(65); # 輸出 A 65.chr; # 輸出 A
chroot FILENAME
彷佛在 Perl 6中不存在。
close FILEHANDLE
像 Perl 5中那樣,關閉一個文件句柄,返回一個邏輯值。close $fh
或者$fh.close
將會同時提供。
closedir DIRHANDLE
如今, Perl 6中並無closedir
函數,當它被實現的時候,它多是IO::Dir的一個方法。
connect SOCKET, NAME
文檔中沒有描述清楚,可是彷佛connect
將會是IO::Socket類的方法。
continue BLOCK
continue
做爲continue
塊使用方法的替代,你可使用NEXT
塊,更接近 Perl 5中continue
用法的是proceed
/succeed
。
cos EXPR
和 Perl 5中同樣,可是還能夠做爲方法使用,也就是(1 / 60000).cos
。
crypt PLAINTEXT, SALT
在 Perl 6中彷佛沒有實現。
dbmclose HASH
dbmopen HASH, DBNAME, MASK
這些函數在 Perl 5中很大程度上被取代了,不太可能出如今 Perl 6中(儘管 Perl 6的數據庫實現多是不成熟的)。
defined EXPR
它可能像你指望的那樣工做,可是從技術上講對於類型對象它返回False
,其它狀況返回True
。它使得當你沒有爲一個東西賦值時$num.perl
會返回Any
或者當你賦值了返回當前值更有意義。固然,你也能夠做爲一個方法使用它:$num.defined
。
delete EXPR
Perl 6使用新的經過指定:deleet
副詞的副詞語法取代了它,好比my $delete_value = %hash{$key}:delete;
和my $delete_value = @array[$i]:delete;
。
die LIST
和 Perl 5版本的功能類似,可是 Perl 6的異常機制比 Perl 5更強大,更靈活。參見exceptions。若是你想忽略堆棧蹤影和位置,就像 Perl 5中的die "...n"
,能夠這樣:
note "...\n"; exit 1;
do BLOCK
和 Perl 5版本的功能類似,不過注意`do`和`BLOCK`之間必須有一個空白。
do EXPR
被 Perl 6中的`EVALFILE`取代。
dump LABEL
根據S29描述,dump
已經被廢棄了。
each HASH
沒有徹底等效的函數,不過你可使用%hash.kv
,它會返回一個鍵值列表,好比:for %hash.kv -> $k, $v { say "$k:$v" }
。
順便,咱們這裏提到的->
被叫作箭頭語句塊,雖然文檔中有不少這種例子,可是並無一個關於它是如何運做的清晰的解釋。s04#The_for_statement對你可能有些幫助,還有設計文檔的S06#Pointy_blocks,另外這裏也有一些信息。
eof FILEHANDLE
在 Perl 6,可能沒有這樣的一個函數了,而是做爲一個方法,也就是$filehandle.eof
,若是文件已經到達末尾它會返回True
。
eval EXPR
被EVAL
替代,注意的是EVAL
不進行任何異常處理。
evalbytes EXPR
在 Perl 6中彷佛不存在。
exec LIST
Perl 6中沒有函數跟 Perl 5中的exec
相同,shell
和run
相似於 Perl 5中的system
,可是exec
在執行了系統命令以後再也不返回的特性須要用相似shell($command);exit();
或者exit shell($command)
的東西來模擬。
exists EXPR
在 Perl 6中不是一個函數,而是一個副詞:
%hash{$key}:exists; @array[$i]:exists;
exit EXPR
看起來和 Perl 5中同樣。
exp EXPR
和 Perl 5中同樣,可是也能夠做爲方法使用: 5.exp
。
fc EXPR
看起來和 Perl 5中同樣。
fcntl FILEHANDLE, FUNCTION, SCALAR
彷佛在 Perl 6中不存在。
__FILE__
被$?FILE
取代。
fileno FILEHANDLE
S32 代表會做爲方法提供,可是彷佛如今並未實現。
flock FILEHANDLE, OPERATION
目前並未實現。
fork
並未做爲內建函數實現,可是能夠經過Native Call
接口使用,例如:use NativeCall; sub fork returns win32 is native { * }; say fork;
。
format
fromline PICTURE, LIST
Perl 6沒有內建的formats。
getc FILEHANDLE
和 Perl 5同樣從輸入流中讀取一個字符,如今也能夠做爲一個方法使用:$filehandle.getc
。
getlogin
S29列出了它,可是好像尚未實現。
getpeername SOCKET
S29列出了它,可是實現彷佛並不清楚,或者就此而言,(並未?)實現(?原文意思看不懂,for that matter, implemented.)。
getpgrp PID
看起來沒有實現。
getpriority WHICH, WHO
看起來沒有實現。
getpwnam NAME
getgrnam NAME
gethosybyname NAME
getnetbyname NAME
getprotobyname NAME
getpwuid UID
getgrgid GID
getservbyname NAME, PROTO
gethostbyaddr ADDR, ADDRTYPE
getnetbyaddr ADDR, ADDRTYPE
getprotobynumber NUMBER
getservbyport PORT, PROTO
getpwent
getgrent
gethostent
getnetent
getprotoent
getservent
setpwent
setgrent
sethostent STAYOPEN
setnetent STAYOPEN
setprotoent STAYOPEN
setservent STAYOPEN
endpwent
endgrent
endhostent
endnetent
endprotoent
endservent
[須要進一步研究]彷佛這個列表中的函數能夠被一些 Roles 好比 User, Group 等處理。
getsockname SOCKET
getsocketopt SOCKET, LEVEL, OPTNAME
[須要進一步研究]如今看起來可能被實現成某種 IO::Socket 對象,可是具體細節不詳。
glob EXPR
在S32中一個例子使用過,可是彷佛沒有實現。
gmtime EXPR
localtime
、gmtime
的各類功能彷佛在DateTime
對象裏,好比獲取一個 UTC 格式的當前時間的DateTime
對象,能夠這麼用:my $gmtime = DateTime.now.utc
。
goto LABEL
goto EXPR
goto &NAME
[須要進一步研究]在 S04中有所描述,可是並不完善。
grep BLOCK LIST
grep EXPR, LIST
在 Perl 6依然存在,不過須要注意的是代碼塊以後須要一個逗號,即@foo = grep {$_ == "bars"}, @baz
,也能夠做爲一個方法使用:@foo = @bar.grep(/^f/)
。
hex EXPR
被副詞形式:16
取代,例如:16("aF")
返回 175。
另外,可使用.base
方法獲得一樣的結果:0xaF.base(10)
。
碰巧.Str
默認顯示的是 10 進制,因此若是你只是say 0xaF
,它依然會打印 175,但這樣不是很直觀,因此可能不是最好的方式。
import LIST
首先在 Perl 5 中它歷來不是一個函數,在 Perl 6中,一般,函數能夠聲明爲導出或者不導出,全部可導出的函數一塊兒導出,然而,可選擇的導出也是可能的,可是這超出了本文檔的範圍,詳見這裏。
index STR, SUBSTR, POSITION
和 Perl 5中同樣,也能夠做爲一個方法使用: "howdy!".index("how"); # 返回值 0
。
int EXPR
在 Perl 6裏面它是和 Perl 5中同樣 的truncate
(截斷)函數(也做爲方法提供),你可能直接使用它做爲 Perl 5代碼的移植版本,可是在 Perl 6中,你能夠對一個數字方便的直接調用 .Int
方法。3.9.Int; # 返回值 3
以及3.9.truncate
是同樣的。
ioctl FILEHANDLE, FUNCTION, SCALAR
目前在 Perl 6中並未實現。
join EXPR, LIST
和 Perl 5中同樣,亦能夠做爲方法使用:@x.join(',')
。
keys HASH
和 Perl 5中同樣,也能夠做爲方法使用:%hash.keys
。
kill SIGNAL, LIST
kill SIGNAL
如今是Proc::ASync
類的一部分,可是看起來和 Perl 5中同樣工做。
last LABEL
last EXPR
last
和 Perl 5中同樣。
lc EXPR
和 Perl 5中同樣,還能夠做爲方法使用:"UGH".lc
。
lcfirst EXPR
在 Perl 6中不存在。
length EXPR
被chars
取代,一般做爲一個方法使用($string.chars
),可是也能夠做爲函數使用。
__LINE__
被$?LINE
取代。
link OLDFILE, NEWFILE
在 Perl 6裏面屬於IO::Path
類的一部分,和 Perl 5中惟一的區別就是參數的順序變了,如今是link($original, $linked_file)
。
listen SOCKET, QUEUESIZE
文檔中沒有明確的描述,可是看起來listen
會做爲IO::Socket
的一個方法。
local EXPR
Perl 6中對等的是temp
。
localtime EXPR
localtime
的大部分的功能均可以在DateTime
中找到,localtime
特定的部分以下:
my $d = DateTime.now; $sec = $d.second; # 多是分鐘秒 $min = $d.minute; # $hour = $d.hour; # $mday = $d.day-of-month; # 或者 $d.day; 1 .. 31 $mon = $d.month; # 1 .. 12 $year = $d.year; # $wday = $d.day-of-week; # 1 => Monday, 2 => Tuesday, ect. $yday = $d.day-of-year; # 1 .. 366
注意在 Perl 6中的範圍並非基於0的,就像上面的例子那樣。
好像沒有一種明確的方式能夠獲得 Perl 5中的$isdst
對應的值, Perl 5中提供的scalar(localtime)
已經不可用了,$d.Str
會返回相似「2015-06-29T12:49:31-04:00」的東西。
lock THING
在 Perl 6裏面,是Lock
類的一個方法。
log EXPR
在 Perl 6中可用,亦能夠做爲方法使用,也就是log(2)
和2.log
效果同樣。
lstat FILEHANDLE
lstat EXPR
lstat DIRHANDLE
lstat
可能在 Perl 6中的IO
類的某處實現了,如今並非很清楚在哪裏。
m//
正則表達式在 Perl 6中有點不同,可是匹配操做依然存在,若是你想重寫 Perl 5的代碼,最重要的區別就是=~
被智能匹配運算符~~
取代,一樣,!~
被!~~
取代,正則操做的設置都是副詞而且複雜,如想了解細節,參見Adverbs。
map BLOCK LIST
map EXPR, LIST
做爲一個函數,和 Perl 5中不一樣的地方是若是你須要一個代碼塊,代碼塊後面必須跟着一個逗號,也能夠做爲一個方法使用:@new = @old.map: { $_ * 2 }
。
mkdir FILENAME, MASK
mkdir FILENAME
和 Perl 5中同樣。
mkdir
無參數的版本(隱式變量$_
)在 Perl 6中沒有實現。
msgctl ID, CMD, ARG
msgget KEY, FLAGS
msgrcv ID, VAR, SIZE, TYPE, FLAGS
msgsnd ID, MSG, FLAGS
在 Perl 6不在內建支持,可能會出如今某些擴展模塊中。
my VARLIST
my TYPE VARLIST
my VARLIST: ATTRS
my TYPE VARLIST: ATTRS
和 Perl 5中同樣。
next LABEL
next EXPR
next
Perl 6中也是同樣。
no MODULE VERSION
no MODULE LIST
no MODULE
no VERSION
在 Perl 6中,它是相似於strict
同樣的編譯指示,可是做用對象不是模塊,並不清楚它是否有版本功能,由於目前有些東西有爭議,我以爲沒有。
oct
被副詞格式:8
取代,好比::8("100")
返回 64。
open FILEHANDLE, EXPR
open FILEHANDLE, MODE, EXPR
open FILEHANDLE, MODE, EXPR, LIST
open FILEHANDLE, MODE, REFERENCE
open FILEHANDLE
相對於 Perl 5最明顯的改變就是文件模式的語法,以只讀方式打開一個文件, 你須要使用open("file", :r);
,以只寫、讀寫以及追加的方式打開須要分別使用:w
,:rw
以及:a
,另外還有一些關於編碼以及如何處理換行的選項,具體參見open。
opendir DIRHANDLE, EXPR
在 Perl 6裏面不是一個內建的函數,你須要使用IO::Path
類:
my $dir = IO::Path.new("directory"); my $dir = "directory".IO; # 跟上面的效果同樣,更直接
ord EXPR
和 Perl 5中同樣,也能夠做爲方法使用:"howdy!".ord;
# 輸出 104
our VARLIST
our TYPE VARLIST
our VARLIST : ATTRS
our TYPE VARLIST : ATTRS
在 Perl 6中一樣可使用。
pack TEMPLATE, LIST
在 Perl 6中依然可用,模板的選項相對 Perl 5如今更加的嚴格,當前的文檔能夠參見unpack。
package NAMESPACE
package NAMESPACE VERSION
package NAMESPACE BLOCK
package NAMESPACE VERSION BLOCK
S10 代表package
在 Perl 6中是可用的,可是隻適用於代碼塊,也就是:package Foo { ... }
表示後面的代碼塊是屬於 package Foo 的,當使用package Foo;
聲明格式時有一種特殊狀況,當它做爲文件的第一條語句時代表文件中剩餘的代碼都是 Perl 5的代碼,可是它的有效性目前尚不清楚。實際上,由於模塊和類的聲明須要不一樣的關鍵字(好比class
),你不大可能會在 Perl 6中直接使用package
。
__PACKAGE__
被$?PACKAGE
取代。
pipe READHANDLE, WRITEHANDLE
可能會被IO::Pipe
類中的某些東西取代,可是如今並無明確的文檔說明。
pop ARRAY
在 Perl 6中一樣工做,也能夠做爲方法使用,即:my $x = pop @a;
和 my $x = @a.pop;
是等價的。
pos SCALAR
在 Perl 6中不可用,和它最具等價功能的是:c
副詞,若是$/
爲真,它默認的值是$/.to
,不然是0
。更多的信息在Continue能夠找到。
print FILEHANDLE LIST
print FILEHANDLE
print LIST
print
在 Perl 6中能夠做爲一個函數使用,默認輸出到標準輸出。做爲函數使用print
而且使用文件句柄替代標準輸出,你須要在文件句柄後加一個冒號,即:print $fh:"Howdy!"
,使用冒號做爲「調用者標記」的用法討論在這裏能夠找到,另外你也可使用方法調用:$fh.print("Howdy!")
。
printf FILEHANDLE
print FORMAT, LIST
printf
在 Perl 6中依然工做,對於格式,參見sprintf
的文檔。
prototype FUNCTION
在 Perl 6中不可用,功能最接近的是.signature
,例如:say &sprintf.signature
,結果是(Cool $format, *@args)
。
push ARRAY, LIST
在 Perl 6 中依然可使用,並且能夠做爲方法使用:@a.push("foo")
,注意,flattening 的行爲和 Perl 5中不一樣:@b.push: @a
將會把@a
做爲單個元素壓入到@b
中,你還能夠參考append method。
q/STRING/
qq/STRING/
qw/STRING/
qx/STRING/
這些用法過渡到 Perl 6 的一些建議:
q/.../ # 依然等價與使用單引號 qq/.../ # 依然等價與使用雙引號 qw/.../ # 更多的相似與 Perl 6中的C<< <...> >>
qutoing介紹了一些新增長的引號構造和他們的等價用法。
qr/STRING/
被rx/.../
取代。
quotemate EXPR
沒有直接的等價用法,換句話說,沒有直接返回字符串中全部ASCII非單詞轉義字符的操做。然而,在 regexes 中使用$foo
會被視爲字符串字面量,使用<$foo>
會將$foo
的內容做爲正則代碼直接內插到表達式中,注意尖括號和它在正則表達式外部的行爲有點不一樣。要了解更多請參考這裏。
rand EXPR
rand
和 Perl 5中同樣能工做,可是你能夠再也不給它提供參數了。把它做爲一個方法使用就會是這樣的效果,即 Perl 5中的rand(100)
等價於 Perl 6中的100.rand
。另外,你還能夠經過(^100).pick
獲取一個隨機的整數,想了解這麼作的理由,能夠參考 ^操做符 以及 pick。
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read
函數如今在 Perl 6 中的IO::Handle
以及IO::Socket
中,它從關聯的句柄或者套接字讀取指定數量的字節(而不是字符),關於 Perl 5中的偏移目前的文檔中還沒說明。
readdir DIRHANDLE
再也不是內建函數。遍歷一個目錄的內容,請參考dir。
readline
在 Perl 6 中再也不可用,某種程度上你最可能想使用.lines
方法,想了解讀取文件的更詳細的信息,參閱io。
readlink EXPR
看起來從 Perl 6 中移除了。
readpipe EXPR
readpipe
看起來在 Perl 6 中並不可用,可是qx//
的功能豐富,因此它可能在某些類中不明顯的使用。
recv SOCKET, SCALAR, LENGTH, FLAGS
出如今IO::Socket
類中,但如今沒有明確的文檔化。
redo LABEL
redo EXPR
redo
在 Perl 6 中沒有發生變化。
ref EXPR
被移除,例如 S29中有「若是你真的想獲得類型名字,你可使用$var.WHAT.perl
,若是你真的想使用 P5 的 ref 機制,使用Perl5::p5ref
」,只不過目前Perl5::p5ref
並不存在。
rename OLDNAME, NEWNAME
在 Perl 6中依然可用。
require VERSION
看起來require
在 Perl 6的模塊中可用,不過不清楚可否和版本號一塊兒工做。
reset EXPR
沒有證據顯示在 Perl 6中有這個函數,實際上, S29 中有它是否有良好的應用場景的疑問,我猜它已經被移除了。
return EXPR
雖然沒有明確的文檔化,可是在 Perl 6中可用。
reverse LIST
在 Perl 6中,你只可使用reverse(@a)
或者@a.reverse
反轉一個列表,要反轉一個字符串,請使用.flip
方法。
rewinddir DIRHANDLE
[須要更多研究]目前沒有一個明顯的直接等價的函數,可能在IO::Path
的一些方法會提供相似的功能,可是目前不清楚是什麼樣子。
rindex STR, SUBSTR, POSITION
和 Perl 5中同樣能工做,還能夠做爲方法使用,好比:$x = "babaganush"; say $x.rindex("a"); say $x.rindex("a", 3); # 輸出 5 3
。
rmdir FILENAME
和 Perl 5中同樣能工做,還能夠做爲方法使用。rmdir "Foo";
和"Foo".IO.rmdir
是等價的。
s///
在 Perl 6中,正則表達式的語法有一些不一樣,可是置換操做是存在的。若是你想重寫一些 Perl 5的代碼,最重要的區別就是=~
被智能匹配操做符~~
取代,一樣的,!~
被!~~
取代。正則操做的選項都變成了副詞而且複雜度增長,詳見Adverbs page。
say FILEHANDLE
say LIST
say
say
能夠做爲一個函數使用,默認輸出到標準輸出。使用文件句柄替代標準輸出,須要在文件句柄後加一個冒號,也就是say $fh:"Howdy!"
。冒號是做爲「調用者標記」來使用的,關於它的討論見https://design.perl6.org/S03.html#line_4019。你也可使用一個方法調用$fh.say("Howdy!")
。
scalar EXPR
顯然,移除了。
seek FILEHANDLE, POSITION, WHENCE
沒有被文檔記錄,不過它列在IO::Handle
類下。
seekdir DIRHANDLE, POS
目前沒有文檔化,可是將會在關於IO
的類中實現,好比IO::Path
。
select FILEHANDLE
「[S]elect 做爲一個全局的概念已經沒了」,當我問到select
時,我被告知$*OUT
以及相似的變量在動態做用域內是可重寫的,還有模塊IO::Capture::Simple
也能夠用
來作和select
功能相同的事情。
semctl ID, SEMNUM, CMD, ARG
semget KEY, NSEMS, FLAGS
semop KEY, OPSTRING
從核心中移處了,也許會在其它模塊中找到。
send SOCKET, MSG, FLAGS, TO
能夠在IO::Socket
類中找到。
setpgrp PID, PGRP
不在屬於核心模塊,可能會在POSIX
模塊中找到。
setpriority WHICH, WHO, PRIORITY
不在屬於核心模塊,可能會在POSIX
模塊中找到。
setsocket SOCKET, LEVEL, OPTNAME, OPTVAL
沒有文檔化,可是可能隱藏在IO
相關的模塊中。
shift ARRAY
shift EXPR
shift
便可以做爲函數使用,又能夠做爲方法使用,shift @a
和 @a.shift
是等價的。
shmctl ID, CMD, ARG
shmget KEY, SIZE, FLAGS
shmread ID, VAR, POS, SIZE
shmwrite ID, STRING, POS, SIZE
從核心中移處了,也許會在其它模塊中找到。
shutdown SOCKET, HOW
沒有文檔化,但看起來被移到了IO::Socket
模塊下。
sin EXPR
便可以做爲函數使用,又能夠做爲方法使用,sin(2)
和 2.sin
是等價的。
sleep EXPR
和 Perl 5 中同樣能夠工做,在寫本文檔的時候,能夠做爲一個方法,但已經被廢棄並在未來的移除掉。
socket SOCKET, DOMAIN, TYPE, PROTOCOL
socketpair SOCKET1, SOCKET2, DIMAIN, TYPE, PROTOCOL
沒有文檔化,但可能在IO::Socket
類中。
sort SUBNAME LIST
sort
在 Perl 6中依然存在,不過有一些不一樣。$a
和$b
再也不是特殊變量(見5to6-perlvar),還有比較例程不在返回正數,負數,或者 0,而是Order::Increase
,Order::Decrease
以及Order::Same
對象,詳見sort。sort
也能夠做爲一個方法使用,換句話說,sort(@a)
等價於@a.sort
。
splice ARRAY, OFFSET, LENGTH
splice ARRAY, OFFSET
splice ARRAY
splice EXPR, OFFSET, LENGTH, LIST
splice EXPR, OFFSET, LENGTH
splice EXPR, OFFSET
splice EXPR
在 Perl 6中可用,也能夠做爲一個方法使用,splice(@foo, 2, 3, <M N O P>);
等價於@foo.splice(2, 3, <M N O P);
。
split /PATTERN/, EXPR, LIMIT
split /PATTERN/, EXPR
split /PATTERN/
跟 Perl 5中大體相同。不過,有一些例外,要達到使用空字符串的特殊行爲,你必須真正的使用空的字符串 - 即//的特殊狀況再也不視爲空的字符串。若是你向split
傳遞了一個正則表達式,它會使用這個正則表達式,一樣字面量會做爲字面量對待。若是你像結果中包含分隔的字符,你須要指定命名參數:all
,像這樣:split(';', "a;b;c", :all); # a ; b ; c
。分隔出的空的塊不會像 Perl 5那樣被移除,須要這個功能請查閱comb
,split
的詳細說明在here。如今,split
天然也能夠做爲方法使用:"a;b;c".split(';')
。
split
像上面描述的那樣,零參數版本好比配合明確的空字符串調用,好比$_ = "a;b;c"; .split("").say(); # .split.say不正確
。
sprintf FORMAT, LIST
像 Perl 5同樣能夠工做,格式化字符如今支持這些:
% %字面量 c 給定代碼點表明的字符 s 字符串 d 有符號整數,十進制 u 無符號整數,十進制 o 無符號整數,八進制 x 無符號整數,十六進制 e 浮點數,科學計算法表示 f 浮點數,固定精度表示 g 浮點數,使用%e或者%f表示 X 相似x,可是使用大寫字母 E 相似e,可是使用大寫E G 相似g,可是使用大寫E(若是適用)
兼容如下字符:
i %d的同義詞 D %ld的同義詞 U %lu的同義詞 O %lo的同義詞 F %f的同義詞
Perl 5(非)兼容:
n 產生一個運行異常 p 產生一個運行異常
如下用來修飾整數,他們不須要操做數,語義並非固定的:
h 把整數理解爲本地「short」 類型(一般是int16) l 把整數理解爲本地「long」 類型(一般是int32或者int64) ll 把整數理解爲本地「long long」 類型(一般是int64) L 把整數理解爲本地「long long」 類型(一般是int64) q 把整數理解爲本地「quads」 類型(一般是int64或者更大)
sqrt EXPR
能夠做爲方法和函數使用,sqrt(4)
以及4.sqrt()
是等價的。
srand EXPR
在 Perl 6中可用。
stat EXPR
stat DIRHANDLE
stat
好像在IO
下實現了,可是目前還不是很明確。
state VARLIST
state TYPE VARLIST
state VARLIST : ATTRS
state TYPE VARLIST : ATTRS
在 Perl 6中可用,見state。
study SCALAR
study
study
已經再也不可用了。
sub NAME BLOCK
sub NAME(PROTO) BLOCK
sub NAME : ATTRS BLOCK
sub NAME(PROTO) : ATTRS BLOCK
毫無心外的,咱們依然可使用例程。你的例程還擁有一個簽名,這容許你指定參數,不過,在缺乏簽名的狀況下(而且只在缺乏簽名的狀況下),@_
仍然包含當前傳遞給函數的參數。因此,從理論上講,若是從 Perl 5移植到 Perl 6你不用改變函數的樣子(不過你應該考慮使用簽名這一選擇)。對於全部的信息詳見functions。
__SUB__
被&?ROUTINE
取代。
substr EXPR, OFFSET, LENGTH, REPLACEMENT
substr EXPR, OFFSET, LENGTH
substr EXPR, OFFSET
便可以做爲函數使用,又能夠做爲方法使用。substr("hola!", 1, 3)
和"hola!".substr(1, 3)
都返回「ola」。
symlink OLDFILE, NEWFILE
如今屬於IO::Path
的一部分。如今和 Perl 5中惟一不一樣是參數的順序變了,如今是link($original, $linked_file)
。
syscall NUMBER, LIST
Perl 6中再也不內建此函數。極可能在某個模塊當中,不過如今不明確。
sysopen FILEHANDLE, FILENAME, MODE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysread FILEHANDLE, SCALAR, LENGTH, OFFSET
sysread FILEHANDLE, SCALAR, LENGTH
sysseek FILEHANDLE, POSITION, WHENCE
和非系統版本的函數同樣,有可能在IO
類中。
system LIST
system PROGRAM LIST
要實現相同的功能,你可能想使用(run)和(shell routine)。
syswrite FILEHANDLE, SCALAR, LENGTH, OFFSET
syswrite FILEHANDLE, SCALAR, LENGTH
syswrite FILEHANDLE, SCALAR
和sysopen
以及其餘函數同樣,被移動到了IO
模塊。
tell FILEHANDLE
在IO::Handle
裏,不過如今除了提到並無文檔化。
telldir DIRHANDLE
可能在IO::Path
裏,不過沒有文檔化。
tie VARIABLE, CLASSNAME, LIST
tie VARIABLE
[須要更多探究] S29代表變量類型已經被容器類型替代,不幸運的是,這意味着實際上沒有此函數描述。
time
「返回當前時間的Int類型的表示」,雖然目前文檔中沒有說明它如何表示當前時間,不過看起來依然是像 Perl 5從某個特定時間開始的秒數。
times
再也不可用。
tr///
和 Perl 5的工做模式很像,惟一的警告就是範圍指定時不一樣了。你必須使用「a..z「替代「a-z」,換句話說使用 Perl的範圍操做符。在 Perl 6中,tr///
有一個文檔完善的方法版本,叫作.trans
。.trans
接受一系列的對組:$x.trans(['a' .. 'c'] => ['A' .. 'C'], ['d' .. 'q'] => ['D' .. 'Q'], ['r' .. 'z'] => ['R' .. 'Z']);
。關於.trans
的使用更詳細的描述能夠在here找到。等價的y///
已經被去掉了。
truncate FILEHANDLE, LENGTH
truncate EXPR, LENGTH
很大可能在IO
模塊中,不過沒有文檔化。
uc EXPR
便可做爲函數使用又可做爲方法使用,uc("ha")
和"ha".uc
都返回"HA"。
ucfirst EXPR
ucfirst
Perl 6已經廢棄了ucfirst
,如今首字符大寫函數tc能夠完成你想作的事情。
umask EXPR
如今是IO
的一個方法,IO.umask
返回當前的umask
。
undef EXPR
Perl 6中已經沒有undef
了,你不能夠反定義一個函數,功能最接近的一個值是Nil
,但你可能不會喜歡使用它。在 Perl 6中,若是你使用相似(undef, $file, $line) = caller;
的語句,你將會直接獲得文件名字以及行數而不是忽略caller
的第一個結果(??If you were using something like (undef, $file, $line) = caller;, you would just get the filename and line number directly in Perl 6 instead of discarding the first result of caller.)。caller
已經被callframe
取代了,因此等價的語句便是($file, $line) = callframe.annotations<file line>;
。
unlink LIST
依然可用,能夠做爲方法使用:"filename".IO.unlink
。
unlink
零參數(隱式參數$_
)版本在 Perl 6中不可用。
unpack TEMPLATE, EXPR
unpack TEMPLATE
在 Perl 6中可用,模板設置部分比起 Perl 5中限制更多了,目前的文檔能夠在這裏找到。
unshift ARRAY, LIST
unshift EXPR, LIST
在 Perl 6中可用,能夠做爲方法使用。unshift(@a, "blah")
等價於@a.unshift("blah")
。
untie VARIABLE
[須要更多探究] 根據S29,方法中對變量用來綁定的操做貌似被容器類型取代了,這變的不是很明確因此我寫下了tie
這一小節。
use Module VERSION LIST
use Module VERSION
use Module LIST
use Module
use VERSION
在 Perl 5中,腳本的運行可能須要一個最低的 Perl 執行文件版本。在 Perl 6中,能夠指定被不一樣 Perl 6可執行文件遵循的規範的版本(好比6.c
)。
utime LIST
根據S32來看已經移除了,而且建議你參考Path.times
。不幸運的是,並無Path.times
這個方法,可能之後IO::Path
中會有等價的方法,不過如今確實沒有。
values HASH
values ARRAY
values EXPR
在 Perl 6中可用,也能夠做爲方法使用,values %hash
等價於%hash.values
。
vec EXPR, OFFSET, BITS
S29說,應該使用聲明bit
、uint2
、uint4
等等的buffer/array
來取代vec
,雖然並不明確,不過確實開始實現這功能了。
wait
[須要更多探究] 目前尚不明確被誰取代了,在Supply
中有一個方法wait
,Channel
以及Promise
中有一個方法await
,對這些函數跟 Perl 5中的wait
關聯並不明確。
waitpid PID, FLAGS
像wait
同樣,這個函數的安排並不明確。
wantarray
由於這些緣由, Perl 6中m沒有wantarray
。
這裏有幾種簡單的方式填補許多須要用到wantarray
的地方。
首先,由於 Perl 6並不須要特殊的引用語法把List
或者Array
包裝成Scalar
,簡單的返回一個列表只須要:
sub listofstuff { return 1, 2, 3; } my $a = listofstuff(); print $a; # 打印 "123" print join('<', listofstuff()); # 打印 "1<2<3"
一個廣泛的應用就是提供一個行或者元素的數組,簡單的打印數組輸出一個優美的字符串。你能夠混入一個.Str
方法來達到這個目的:
sub prettylist(*@origlist) { @origlist but role { method Str { self.join("<") } } } print prettylist(1, 2, 3); # 打印 "1<2<3" print join(">", prettylist(1, 2, 3)); # 打印 "1>2>3"
在上面的例子中,返回的列表多是惰性的,.Str
方法將不會被調用直到字符串化,因此並不會有額外的工做產生沒有請求到的東西。
另外一種狀況就是須要建立一個能夠在空上下文使用,可是賦值時會拷貝的調整器(?? Another use case is to create methods which are mutators when called in void context but produce copies during assignment.)。一般狀況下在 Perl 6中不要這樣作,由於你能夠經過使用.=
運算符快速的完成產生拷貝(copy-producing)的方法到調整器的轉換:
my $a = "foo\n"; $a.ords.say; # 打印 "(102, 111, 111, 10)" $a.=chomp; $a.ords.say; # 打印 "(102, 111, 111)"
可是若是你想在兩種操做下使用同一個函數名稱,大多數狀況下你能夠混入一個在結果發現本身處於空上下文的時會自動調用的.sink
方法來完成。然而,這有須要警告你,並不建議這麼作:
multi sub increment($b is rw) { ($b + 1) does role { method sink { $b++ }) } } multi sub increment($b) { ($b + 1) } my $a = 1; increment($a); say $a; # 打印 "2" my $b = increment($a); say $a, $b; # 打印 "23" # 用戶將會意識到這以後他們不該該意外sink一個存儲的值,儘管這須要一些功夫 sub identity($c is rw) { $c }; $a = 1; $b = increment($a); identity($b); $a.say; # 打印 "2" #!!!!
warn LIST
warn
拋出一個異常。簡單的將信息打印到$*ERR
中,你可使用note
函數。查看更多的異常,請見Exceptions。
write FILEHANDLE
write EXPR
write
格式化輸出以及移除了,因此函數在Perl 6中再也不可用。
y///
tr///
的同義詞已經移除了,對於此功能請參考tr///
。