[譯][Perl 6] 5to6-perlfunc

About

-    Perl 6 document
-    翻譯

Translation

原文html

從 Perl 5到 Perl 6

函數

描述

一個全面的(但願如此)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 頻道中的成員負責輸入(??)。算法

字母順序的 Perl 函數

文件測試

  • -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

  • abs VALUE(值)

能夠是一個函數(abs(x)),也能夠是一個方法。然而有一個問題,方法綁定的優先級大於-(負號),因此,-15.abs將做爲-(15.abs)求值,結果是-15,在這種狀況下,你可能須要作相似與(-15).abs的處理。
在缺乏一個值的時候,abs能夠工做在$_上面,可是不是一個函數,而是一個方法,你須要用.abs替換比較簡單的abs來調用它。

accept

  • accept NEWSOCKET, GENERICSOCKET

accept是一個你能夠在服務器端使用的方法,例如$server.accept(),做爲原來封裝的地址返回值替代,它返回一個socket,最有多是一個IO::Socket對象。

alarm

  • alarm SECONDS

[須要進一步研究]已經沒有alarm()了,有人建議用新的併發功能取代它,好比Promise.in,可是爲了真正模擬它可能須要一些「挖掘」。

atan2

  • atan2 Y, X

便可以做爲函數又能夠做爲方法使用,下面的兩種方式是等價的:

atan2(100);
100.atan2;

bind

  • bind SOCKET, NAME

[須要進一步研究]在 Perl 6沒有和 socket 相關函數bind()簽名一致的函數,做爲一個猜測,socket 綁定在建立一個新的 socket 對象的時候完成。

binmode

  • binmode FILEHANDLE

做爲替代手段,你能夠在打開文件的時候使用:bin文件模式,好比 my $fh = open('/path/to/file', :bin);

bless

  • bless REF, CLASSNAME

由於 Perl 6中類的建立發生了改變,可能會比 Perl 5中更少被用到,如今它是一個方法也是一個函數。Perl 6文檔中說,它能夠建立一個和 invocant 類型同樣的新的對象,使用命名參數初始化屬性,而後返回建立的對象。若是你正在移植一個 Perl 5的模塊到 Perl 6,頗有可能你想使用new來建立對象,而不是bless,雖然有些狀況下,後者也會有用。

break

  • break

在 Perl 6中被移除,若是你想跳出given塊結構,你可能須要看一下proceedsucceed,地址是這裏

caller

  • 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

  • chdir EXPR

彷佛和 Perl 5中同樣。

chmod

  • chmod LIST

和 Perl 5中同樣是函數,只是8進制數的表示有些不大同樣(是0o755而不是0755),你也能夠把它做爲方法使用,好比$fh.chmod(0o755)

chomp

  • chomp VARIABLE

chomp的行爲和 Perl 5中有些不一樣,它對目標不產生影響,而是返回一個去除邏輯換行符的新的目標,也就是$x = "howdyn"; $y = chomp($x);,結果是$x包含「howdyn」以及$y包含「howdy」。一樣能夠做爲方法使用,也就是$y = $x.chomp

chop

  • chop VARIABLE

chomp同樣,在 Perl 6中,它返回被短切之後的字符串,而不是直接短切替換,也就是$x = "howdy"; $y = chop($x);,結果是$x包含「howdy」以及$y包含「howd」。一樣能夠做爲方法使用:$y = $x.chop

chown

  • chown LIST

Perl 6中沒有chown

chr

  • chr NUMBER

和 Perl 5的版本類似,把目標強制轉換成整數,而後做爲一個 Unicode code point 並返回相關的字符,能夠做爲函數或者方法使用:

chr(65);    # 輸出 A
65.chr;        # 輸出 A

chroot

  • chroot FILENAME

彷佛在 Perl 6中不存在。

close

  • close FILEHANDLE

像 Perl 5中那樣,關閉一個文件句柄,返回一個邏輯值。close $fh或者$fh.close將會同時提供。

closedir

  • closedir DIRHANDLE

如今, Perl 6中並無closedir函數,當它被實現的時候,它多是IO::Dir的一個方法。

connect

  • connect SOCKET, NAME

文檔中沒有描述清楚,可是彷佛connect將會是IO::Socket類的方法。

continue

  • continue BLOCK

  • continue

做爲continue塊使用方法的替代,你可使用NEXT塊,更接近 Perl 5中continue用法的是proceed/succeed

cos

  • cos EXPR

和 Perl 5中同樣,可是還能夠做爲方法使用,也就是(1 / 60000).cos

crypt

  • crypt PLAINTEXT, SALT

在 Perl 6中彷佛沒有實現。

dbm function

  • dbmclose HASH

  • dbmopen HASH, DBNAME, MASK

這些函數在 Perl 5中很大程度上被取代了,不太可能出如今 Perl 6中(儘管 Perl 6的數據庫實現多是不成熟的)。

defined

  • defined EXPR

它可能像你指望的那樣工做,可是從技術上講對於類型對象它返回False,其它狀況返回True。它使得當你沒有爲一個東西賦值時$num.perl會返回Any或者當你賦值了返回當前值更有意義。固然,你也能夠做爲一個方法使用它:$num.defined

delete

  • delete EXPR

Perl 6使用新的經過指定:deleet副詞的副詞語法取代了它,好比my $delete_value = %hash{$key}:delete;my $delete_value = @array[$i]:delete;

die

  • die LIST

和 Perl 5版本的功能類似,可是 Perl 6的異常機制比 Perl 5更強大,更靈活。參見exceptions。若是你想忽略堆棧蹤影和位置,就像 Perl 5中的die "...n",能夠這樣:

note "...\n";
exit 1;

do

  • do BLOCK

    和 Perl 5版本的功能類似,不過注意`do`和`BLOCK`之間必須有一個空白。
  • do EXPR

    被 Perl 6中的`EVALFILE`取代。

dump

  • dump LABEL

根據S29描述,dump已經被廢棄了。

each

  • each HASH

沒有徹底等效的函數,不過你可使用%hash.kv,它會返回一個鍵值列表,好比:for %hash.kv -> $k, $v { say "$k:$v" }
順便,咱們這裏提到的->被叫作箭頭語句塊,雖然文檔中有不少這種例子,可是並無一個關於它是如何運做的清晰的解釋。s04#The_for_statement對你可能有些幫助,還有設計文檔的S06#Pointy_blocks,另外這裏也有一些信息。

eof

  • eof FILEHANDLE

在 Perl 6,可能沒有這樣的一個函數了,而是做爲一個方法,也就是$filehandle.eof,若是文件已經到達末尾它會返回True

eval

  • eval EXPR

EVAL替代,注意的是EVAL不進行任何異常處理。

evalbytes

  • evalbytes EXPR

在 Perl 6中彷佛不存在。

exec

  • exec LIST

Perl 6中沒有函數跟 Perl 5中的exec相同,shellrun相似於 Perl 5中的system,可是exec在執行了系統命令以後再也不返回的特性須要用相似shell($command);exit();或者exit shell($command)的東西來模擬。

exists

  • exists EXPR

在 Perl 6中不是一個函數,而是一個副詞:

%hash{$key}:exists;
@array[$i]:exists;

exit

  • exit EXPR

看起來和 Perl 5中同樣。

exp

  • exp EXPR

和 Perl 5中同樣,可是也能夠做爲方法使用: 5.exp

fc

  • fc EXPR

看起來和 Perl 5中同樣。

fcntl

  • fcntl FILEHANDLE, FUNCTION, SCALAR

彷佛在 Perl 6中不存在。

__FILE__

  • __FILE__

$?FILE取代。

fileno

  • fileno FILEHANDLE

S32 代表會做爲方法提供,可是彷佛如今並未實現。

flock

  • flock FILEHANDLE, OPERATION

目前並未實現。

fork

  • fork

並未做爲內建函數實現,可是能夠經過Native Call接口使用,例如:use NativeCall; sub fork returns win32 is native { * }; say fork;

formats

  • format

  • fromline PICTURE, LIST

Perl 6沒有內建的formats。

getc

  • getc FILEHANDLE

和 Perl 5同樣從輸入流中讀取一個字符,如今也能夠做爲一個方法使用:$filehandle.getc

getlogin

  • getlogin

S29列出了它,可是好像尚未實現。

getpeername

  • getpeername SOCKET

S29列出了它,可是實現彷佛並不清楚,或者就此而言,(並未?)實現(?原文意思看不懂,for that matter, implemented.)。

getpgrp

  • getpgrp PID

看起來沒有實現。

getpriority

  • getpriority WHICH, WHO

看起來沒有實現。

get and set function

  • 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 等處理。

getsock*

  • getsockname SOCKET

  • getsocketopt SOCKET, LEVEL, OPTNAME

[須要進一步研究]如今看起來可能被實現成某種 IO::Socket 對象,可是具體細節不詳。

glob

  • glob EXPR

在S32中一個例子使用過,可是彷佛沒有實現。

gmtime

  • gmtime EXPR

localtimegmtime的各類功能彷佛在DateTime對象裏,好比獲取一個 UTC 格式的當前時間的DateTime對象,能夠這麼用:my $gmtime = DateTime.now.utc

goto

  • goto LABEL

  • goto EXPR

  • goto &NAME

[須要進一步研究]在 S04中有所描述,可是並不完善。

grep

  • grep BLOCK LIST

  • grep EXPR, LIST

在 Perl 6依然存在,不過須要注意的是代碼塊以後須要一個逗號,即@foo = grep {$_ == "bars"}, @baz,也能夠做爲一個方法使用:@foo = @bar.grep(/^f/)

hex

  • hex EXPR

被副詞形式:16取代,例如:16("aF")返回 175。
另外,可使用.base方法獲得一樣的結果:0xaF.base(10)
碰巧.Str默認顯示的是 10 進制,因此若是你只是say 0xaF,它依然會打印 175,但這樣不是很直觀,因此可能不是最好的方式。

import

  • import LIST

首先在 Perl 5 中它歷來不是一個函數,在 Perl 6中,一般,函數能夠聲明爲導出或者不導出,全部可導出的函數一塊兒導出,然而,可選擇的導出也是可能的,可是這超出了本文檔的範圍,詳見這裏

index

  • index STR, SUBSTR, POSITION

和 Perl 5中同樣,也能夠做爲一個方法使用: "howdy!".index("how"); # 返回值 0

int

  • int EXPR

在 Perl 6裏面它是和 Perl 5中同樣 的truncate(截斷)函數(也做爲方法提供),你可能直接使用它做爲 Perl 5代碼的移植版本,可是在 Perl 6中,你能夠對一個數字方便的直接調用 .Int方法。3.9.Int; # 返回值 3以及3.9.truncate是同樣的。

ioctl

  • ioctl FILEHANDLE, FUNCTION, SCALAR

目前在 Perl 6中並未實現。

join

  • join EXPR, LIST

和 Perl 5中同樣,亦能夠做爲方法使用:@x.join(',')

keys

  • keys HASH

和 Perl 5中同樣,也能夠做爲方法使用:%hash.keys

kill

  • kill SIGNAL, LIST

  • kill SIGNAL

如今是Proc::ASync類的一部分,可是看起來和 Perl 5中同樣工做。

last

  • last LABEL

  • last EXPR

  • last

和 Perl 5中同樣。

lc

  • lc EXPR

和 Perl 5中同樣,還能夠做爲方法使用:"UGH".lc

lcfirst

  • lcfirst EXPR

在 Perl 6中不存在。

length

  • length EXPR

chars取代,一般做爲一個方法使用($string.chars),可是也能夠做爲函數使用。

__LINE__

  • __LINE__

$?LINE取代。

link

  • link OLDFILE, NEWFILE

在 Perl 6裏面屬於IO::Path類的一部分,和 Perl 5中惟一的區別就是參數的順序變了,如今是link($original, $linked_file)

listen

  • listen SOCKET, QUEUESIZE

文檔中沒有明確的描述,可是看起來listen會做爲IO::Socket的一個方法。

local

  • local EXPR

Perl 6中對等的是temp

localtime

  • 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

  • lock THING

在 Perl 6裏面,是Lock類的一個方法。

log

  • log EXPR

在 Perl 6中可用,亦能夠做爲方法使用,也就是log(2)2.log效果同樣。

lstat

  • lstat FILEHANDLE

  • lstat EXPR

  • lstat DIRHANDLE

  • lstat

可能在 Perl 6中的IO類的某處實現了,如今並非很清楚在哪裏。

m//

  • m//

正則表達式在 Perl 6中有點不同,可是匹配操做依然存在,若是你想重寫 Perl 5的代碼,最重要的區別就是=~被智能匹配運算符~~取代,一樣,!~!~~取代,正則操做的設置都是副詞而且複雜,如想了解細節,參見Adverbs

map

  • map BLOCK LIST

  • map EXPR, LIST

做爲一個函數,和 Perl 5中不一樣的地方是若是你須要一個代碼塊,代碼塊後面必須跟着一個逗號,也能夠做爲一個方法使用:@new = @old.map: { $_ * 2 }

mkdir

  • mkdir FILENAME, MASK

  • mkdir FILENAME

和 Perl 5中同樣。

  • mkdir

無參數的版本(隱式變量$_)在 Perl 6中沒有實現。

msg*

  • msgctl ID, CMD, ARG

  • msgget KEY, FLAGS

  • msgrcv ID, VAR, SIZE, TYPE, FLAGS

  • msgsnd ID, MSG, FLAGS

在 Perl 6不在內建支持,可能會出如今某些擴展模塊中。

my

  • my VARLIST

  • my TYPE VARLIST

  • my VARLIST: ATTRS

  • my TYPE VARLIST: ATTRS

和 Perl 5中同樣。

next

  • next LABEL

  • next EXPR

  • next

Perl 6中也是同樣。

no

  • no MODULE VERSION

  • no MODULE LIST

  • no MODULE

  • no VERSION

在 Perl 6中,它是相似於strict同樣的編譯指示,可是做用對象不是模塊,並不清楚它是否有版本功能,由於目前有些東西有爭議,我以爲沒有。

oct

  • oct

被副詞格式:8取代,好比::8("100") 返回 64。

open

  • 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

  • opendir DIRHANDLE, EXPR

在 Perl 6裏面不是一個內建的函數,你須要使用IO::Path類:

my $dir = IO::Path.new("directory");

my $dir = "directory".IO; # 跟上面的效果同樣,更直接

ord

  • ord EXPR

和 Perl 5中同樣,也能夠做爲方法使用:"howdy!".ord; # 輸出 104

our

  • our VARLIST

  • our TYPE VARLIST

  • our VARLIST : ATTRS

  • our TYPE VARLIST : ATTRS

在 Perl 6中一樣可使用。

pack

  • pack TEMPLATE, LIST

在 Perl 6中依然可用,模板的選項相對 Perl 5如今更加的嚴格,當前的文檔能夠參見unpack

package

  • 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__

$?PACKAGE取代。

pipe

  • pipe READHANDLE, WRITEHANDLE

可能會被IO::Pipe類中的某些東西取代,可是如今並無明確的文檔說明。

pop

  • pop ARRAY

在 Perl 6中一樣工做,也能夠做爲方法使用,即:my $x = pop @a;my $x = @a.pop; 是等價的。

pos

  • pos SCALAR

在 Perl 6中不可用,和它最具等價功能的是:c副詞,若是$/爲真,它默認的值是$/.to,不然是0。更多的信息在Continue能夠找到。

print

  • print FILEHANDLE LIST

  • print FILEHANDLE

  • print LIST

  • print

print在 Perl 6中能夠做爲一個函數使用,默認輸出到標準輸出。做爲函數使用print而且使用文件句柄替代標準輸出,你須要在文件句柄後加一個冒號,即:print $fh:"Howdy!",使用冒號做爲「調用者標記」的用法討論在這裏能夠找到,另外你也可使用方法調用:$fh.print("Howdy!")

printf

  • printf FILEHANDLE

  • print FORMAT, LIST

  • printf

在 Perl 6中依然工做,對於格式,參見sprintf的文檔。

prototype

  • prototype FUNCTION

在 Perl 6中不可用,功能最接近的是.signature,例如:say &sprintf.signature,結果是(Cool $format, *@args)

push

  • push ARRAY, LIST

在 Perl 6 中依然可使用,並且能夠做爲方法使用:@a.push("foo"),注意,flattening 的行爲和 Perl 5中不一樣:@b.push: @a將會把@a做爲單個元素壓入到@b中,你還能夠參考append method

qutoing

  • 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

  • rand EXPR

rand和 Perl 5中同樣能工做,可是你能夠再也不給它提供參數了。把它做爲一個方法使用就會是這樣的效果,即 Perl 5中的rand(100)等價於 Perl 6中的100.rand。另外,你還能夠經過(^100).pick獲取一個隨機的整數,想了解這麼作的理由,能夠參考 ^操做符 以及 pick

read

  • read FILEHANDLE, SCALAR, LENGTH, OFFSET

read函數如今在 Perl 6 中的IO::Handle以及IO::Socket中,它從關聯的句柄或者套接字讀取指定數量的字節(而不是字符),關於 Perl 5中的偏移目前的文檔中還沒說明。

readdir

  • readdir DIRHANDLE

再也不是內建函數。遍歷一個目錄的內容,請參考dir

readline

  • readline

在 Perl 6 中再也不可用,某種程度上你最可能想使用.lines方法,想了解讀取文件的更詳細的信息,參閱io

readlink

  • readlink EXPR

看起來從 Perl 6 中移除了。

readpipe

  • readpipe EXPR

  • readpipe

看起來在 Perl 6 中並不可用,可是qx//的功能豐富,因此它可能在某些類中不明顯的使用。

recv

  • recv SOCKET, SCALAR, LENGTH, FLAGS

出如今IO::Socket類中,但如今沒有明確的文檔化。

redo

  • redo LABEL

  • redo EXPR

  • redo

在 Perl 6 中沒有發生變化。

ref

  • ref EXPR

被移除,例如 S29中有「若是你真的想獲得類型名字,你可使用$var.WHAT.perl,若是你真的想使用 P5 的 ref 機制,使用Perl5::p5ref」,只不過目前Perl5::p5ref並不存在。

rename

  • rename OLDNAME, NEWNAME

在 Perl 6中依然可用。

requires

  • require VERSION

看起來require在 Perl 6的模塊中可用,不過不清楚可否和版本號一塊兒工做。

reset

  • reset EXPR

沒有證據顯示在 Perl 6中有這個函數,實際上, S29 中有它是否有良好的應用場景的疑問,我猜它已經被移除了。

return

  • return EXPR

雖然沒有明確的文檔化,可是在 Perl 6中可用。

reverse

  • reverse LIST

在 Perl 6中,你只可使用reverse(@a)或者@a.reverse反轉一個列表,要反轉一個字符串,請使用.flip方法。

rewinddir

  • rewinddir DIRHANDLE

[須要更多研究]目前沒有一個明顯的直接等價的函數,可能在IO::Path的一些方法會提供相似的功能,可是目前不清楚是什麼樣子。

rindex

  • rindex STR, SUBSTR, POSITION

和 Perl 5中同樣能工做,還能夠做爲方法使用,好比:$x = "babaganush"; say $x.rindex("a"); say $x.rindex("a", 3); # 輸出 5 3

rmdir

  • rmdir FILENAME

和 Perl 5中同樣能工做,還能夠做爲方法使用。rmdir "Foo";"Foo".IO.rmdir是等價的。

s///

  • s///

在 Perl 6中,正則表達式的語法有一些不一樣,可是置換操做是存在的。若是你想重寫一些 Perl 5的代碼,最重要的區別就是=~被智能匹配操做符~~取代,一樣的,!~!~~取代。正則操做的選項都變成了副詞而且複雜度增長,詳見Adverbs page

say

  • say FILEHANDLE

  • say LIST

  • say

say能夠做爲一個函數使用,默認輸出到標準輸出。使用文件句柄替代標準輸出,須要在文件句柄後加一個冒號,也就是say $fh:"Howdy!"。冒號是做爲「調用者標記」來使用的,關於它的討論見https://design.perl6.org/S03.html#line_4019。你也可使用一個方法調用$fh.say("Howdy!")

scalar

  • scalar EXPR

顯然,移除了。

seek

  • seek FILEHANDLE, POSITION, WHENCE

沒有被文檔記錄,不過它列在IO::Handle類下。

seekdir

  • seekdir DIRHANDLE, POS

目前沒有文檔化,可是將會在關於IO的類中實現,好比IO::Path

select

  • select FILEHANDLE

「[S]elect 做爲一個全局的概念已經沒了」,當我問到select時,我被告知$*OUT以及相似的變量在動態做用域內是可重寫的,還有模塊IO::Capture::Simple也能夠用
來作和select功能相同的事情。

sem*

  • semctl ID, SEMNUM, CMD, ARG

  • semget KEY, NSEMS, FLAGS

  • semop KEY, OPSTRING

從核心中移處了,也許會在其它模塊中找到。

send

  • send SOCKET, MSG, FLAGS, TO

能夠在IO::Socket類中找到。

setpgrp

  • setpgrp PID, PGRP

不在屬於核心模塊,可能會在POSIX模塊中找到。

setpriority

  • setpriority WHICH, WHO, PRIORITY

不在屬於核心模塊,可能會在POSIX模塊中找到。

setsocket

  • setsocket SOCKET, LEVEL, OPTNAME, OPTVAL

沒有文檔化,可是可能隱藏在IO相關的模塊中。

shift

  • shift ARRAY

  • shift EXPR

  • shift

便可以做爲函數使用,又能夠做爲方法使用,shift @a@a.shift 是等價的。

shm*

  • shmctl ID, CMD, ARG

  • shmget KEY, SIZE, FLAGS

  • shmread ID, VAR, POS, SIZE

  • shmwrite ID, STRING, POS, SIZE

從核心中移處了,也許會在其它模塊中找到。

shutdown

  • shutdown SOCKET, HOW

沒有文檔化,但看起來被移到了IO::Socket模塊下。

sin

  • sin EXPR

便可以做爲函數使用,又能夠做爲方法使用,sin(2)2.sin 是等價的。

sleep

  • sleep EXPR

和 Perl 5 中同樣能夠工做,在寫本文檔的時候,能夠做爲一個方法,但已經被廢棄並在未來的移除掉。

sockets

  • socket SOCKET, DOMAIN, TYPE, PROTOCOL

  • socketpair SOCKET1, SOCKET2, DIMAIN, TYPE, PROTOCOL

沒有文檔化,但可能在IO::Socket類中。

sort

  • sort SUBNAME LIST

sort在 Perl 6中依然存在,不過有一些不一樣。$a$b再也不是特殊變量(見5to6-perlvar),還有比較例程不在返回正數,負數,或者 0,而是Order::IncreaseOrder::Decrease以及Order::Same對象,詳見sortsort也能夠做爲一個方法使用,換句話說,sort(@a)等價於@a.sort

splice

  • 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

  • split /PATTERN/, EXPR, LIMIT

  • split /PATTERN/, EXPR

  • split /PATTERN/

跟 Perl 5中大體相同。不過,有一些例外,要達到使用空字符串的特殊行爲,你必須真正的使用空的字符串 - 即//的特殊狀況再也不視爲空的字符串。若是你向split傳遞了一個正則表達式,它會使用這個正則表達式,一樣字面量會做爲字面量對待。若是你像結果中包含分隔的字符,你須要指定命名參數:all,像這樣:split(';', "a;b;c", :all); # a ; b ; c。分隔出的空的塊不會像 Perl 5那樣被移除,須要這個功能請查閱combsplit的詳細說明在here。如今,split天然也能夠做爲方法使用:"a;b;c".split(';')

  • split

像上面描述的那樣,零參數版本好比配合明確的空字符串調用,好比$_ = "a;b;c"; .split("").say(); # .split.say不正確

sprintf

  • 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

  • sqrt EXPR

能夠做爲方法和函數使用,sqrt(4)以及4.sqrt()是等價的。

srand

  • srand EXPR

在 Perl 6中可用。

stat

  • stat EXPR

  • stat DIRHANDLE

  • stat

好像在IO下實現了,可是目前還不是很明確。

state

  • state VARLIST

  • state TYPE VARLIST

  • state VARLIST : ATTRS

  • state TYPE VARLIST : ATTRS

在 Perl 6中可用,見state

study

  • study SCALAR

  • study

study已經再也不可用了。

sub

  • sub NAME BLOCK

  • sub NAME(PROTO) BLOCK

  • sub NAME : ATTRS BLOCK

  • sub NAME(PROTO) : ATTRS BLOCK

毫無心外的,咱們依然可使用例程。你的例程還擁有一個簽名,這容許你指定參數,不過,在缺乏簽名的狀況下(而且只在缺乏簽名的狀況下),@_仍然包含當前傳遞給函數的參數。因此,從理論上講,若是從 Perl 5移植到 Perl 6你不用改變函數的樣子(不過你應該考慮使用簽名這一選擇)。對於全部的信息詳見functions

__SUB__

  • __SUB__

&?ROUTINE取代。

substr

  • substr EXPR, OFFSET, LENGTH, REPLACEMENT

  • substr EXPR, OFFSET, LENGTH

  • substr EXPR, OFFSET

便可以做爲函數使用,又能夠做爲方法使用。substr("hola!", 1, 3)"hola!".substr(1, 3)都返回「ola」。

symlink

  • symlink OLDFILE, NEWFILE

如今屬於IO::Path的一部分。如今和 Perl 5中惟一不一樣是參數的順序變了,如今是link($original, $linked_file)

syscall

  • syscall NUMBER, LIST

Perl 6中再也不內建此函數。極可能在某個模塊當中,不過如今不明確。

sys*

  • sysopen FILEHANDLE, FILENAME, MODE

  • sysopen FILEHANDLE, FILENAME, MODE, PERMS

  • sysread FILEHANDLE, SCALAR, LENGTH, OFFSET

  • sysread FILEHANDLE, SCALAR, LENGTH

  • sysseek FILEHANDLE, POSITION, WHENCE

和非系統版本的函數同樣,有可能在IO類中。

system

  • system LIST

  • system PROGRAM LIST

要實現相同的功能,你可能想使用(run)和(shell routine)。

syswrite

  • syswrite FILEHANDLE, SCALAR, LENGTH, OFFSET

  • syswrite FILEHANDLE, SCALAR, LENGTH

  • syswrite FILEHANDLE, SCALAR

sysopen以及其餘函數同樣,被移動到了IO模塊。

tell

  • tell FILEHANDLE

IO::Handle裏,不過如今除了提到並無文檔化。

telldir

  • telldir DIRHANDLE

可能在IO::Path裏,不過沒有文檔化。

tie

  • tie VARIABLE, CLASSNAME, LIST

  • tie VARIABLE

[須要更多探究] S29代表變量類型已經被容器類型替代,不幸運的是,這意味着實際上沒有此函數描述。

time

  • time

「返回當前時間的Int類型的表示」,雖然目前文檔中沒有說明它如何表示當前時間,不過看起來依然是像 Perl 5從某個特定時間開始的秒數。

times

  • times

再也不可用。

tr///

  • 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

  • truncate FILEHANDLE, LENGTH

  • truncate EXPR, LENGTH

很大可能在IO模塊中,不過沒有文檔化。

uc

  • uc EXPR

便可做爲函數使用又可做爲方法使用,uc("ha")"ha".uc都返回"HA"。

ucfirst

  • ucfirst EXPR

  • ucfirst

Perl 6已經廢棄了ucfirst,如今首字符大寫函數tc能夠完成你想作的事情。

umask

  • umask EXPR

如今是IO的一個方法,IO.umask返回當前的umask

undef

  • 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

  • unlink LIST

依然可用,能夠做爲方法使用:"filename".IO.unlink

  • unlink

零參數(隱式參數$_)版本在 Perl 6中不可用。

unpack

  • unpack TEMPLATE, EXPR

  • unpack TEMPLATE

在 Perl 6中可用,模板設置部分比起 Perl 5中限制更多了,目前的文檔能夠在這裏找到。

unshift

  • unshift ARRAY, LIST

  • unshift EXPR, LIST

在 Perl 6中可用,能夠做爲方法使用。unshift(@a, "blah")等價於@a.unshift("blah")

untie

  • untie VARIABLE

[須要更多探究] 根據S29,方法中對變量用來綁定的操做貌似被容器類型取代了,這變的不是很明確因此我寫下了tie這一小節。

use

  • use Module VERSION LIST

  • use Module VERSION

  • use Module LIST

  • use Module

  • use VERSION

在 Perl 5中,腳本的運行可能須要一個最低的 Perl 執行文件版本。在 Perl 6中,能夠指定被不一樣 Perl 6可執行文件遵循的規範的版本(好比6.c)。

utime

  • utime LIST

根據S32來看已經移除了,而且建議你參考Path.times。不幸運的是,並無Path.times這個方法,可能之後IO::Path中會有等價的方法,不過如今確實沒有。

values

  • values HASH

  • values ARRAY

  • values EXPR

在 Perl 6中可用,也能夠做爲方法使用,values %hash等價於%hash.values

vec

  • vec EXPR, OFFSET, BITS

S29說,應該使用聲明bituint2uint4等等的buffer/array來取代vec,雖然並不明確,不過確實開始實現這功能了。

wait

  • wait

[須要更多探究] 目前尚不明確被誰取代了,在Supply中有一個方法waitChannel以及Promise中有一個方法await,對這些函數跟 Perl 5中的wait關聯並不明確。

waitpid

  • waitpid PID, FLAGS

wait同樣,這個函數的安排並不明確。

wantarray

  • 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

  • warn LIST

warn拋出一個異常。簡單的將信息打印到$*ERR中,你可使用note函數。查看更多的異常,請見Exceptions

write

  • write FILEHANDLE

  • write EXPR

  • write

格式化輸出以及移除了,因此函數在Perl 6中再也不可用。

y///

  • y///

tr///的同義詞已經移除了,對於此功能請參考tr///

相關文章
相關標籤/搜索