[译][Perl 6] 5to6-perlfunc

About

- Perl 6 document
- 翻译

Translation

原文

从 Perl 5到 Perl 6

函数

描述

一个全面的(希望如此)Perl 5内建函数在 Perl 6中的等价物列表,并在必要时记录他们的差异。

注意

我将不会详细的解释函数,本文档只是尝试引导你从 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(文件句柄)

  • -X EXPR(表达式)

  • -X DIRHANDLE(目录句柄)

  • -X

对于文件测试 Perl 6给了你两种选择,你可以使用智能匹配(~~)或者调用对应的方法。
在 Perl 6中进行文件测试,你不必像传统方式一样需要打开一个文件句柄(当然你仍然可以使用文件句柄),简单的向文件名字后面追加.IO即可。下面是使用智能匹配检测一个文件是否可读的示例:

'/path/to/file'.IO ~~ :r

你仍然可以利用一个已经打开的文件句柄完成测试,现在我们有一个文件句柄$fh,使用方法调用语法完成可读性文件测试如下:

$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的第二、三个返回值返回,它们现在在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///

作者:araraloren原文地址:https://segmentfault.com/a/1190000007478703

%s 个评论

要回复文章请先登录注册