php seekdir,[译][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风格的函数。

源码

字母顺序的 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块结构,你可能需要看一下proceed和succeed,地址是这里。

caller

caller EXPR

[需要进一步研究]在 Perl 5中caller已经被callframe取代,一个简单的callframe调用不会有很大的用处,它不返回有用的信息,而是一个 CallFrame 对象。在 Perl 5中,文件名字和文件行数作为caller的第二、三个返回值返回,它们现在在callframe.annotations里面,你可以使用callframe().annotations.获取他们,或者使用callframe().annotations.以及callframe().annotations.分别获取。[??]然而,如果没有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相同,shell和run类似于 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

localtime、gmtime的各种功能似乎在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的内容作为正则代码直接内插到表达式中,注意尖括号和它在正则表达式外部的行为有点不同。要了解更多请参考这里。

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::Increase,Order::Decrease以及Order::Same对象,详见sort。sort也可以作为一个方法使用,换句话说,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, );等价于@foo.splice(2, 3,

split

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

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

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说,应该使用声明bit、uint2、uint4等等的buffer/array来取代vec,虽然并不明确,不过确实开始实现这功能了。

wait

wait

[需要更多探究] 目前尚不明确被谁取代了,在Supply中有一个方法wait,Channel以及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('

一个普遍的应用就是提供一个行或者元素的数组,简单的打印数组输出一个优美的字符串。你可以混入一个.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///。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值