- 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///
。