[译][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///

相关文章
相关标签/搜索