[译][Perl 6] 5to6-perlfunc

浏览: 187 发布日期: 2016-11-14 分类: perl

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中不可用。

<
返回顶部