什么是Perl内置的运算符/函数?

Rap*_*ael 14 perl

我读起的Perl西蒙科泽斯并在第8章-子程序他指出,"子程序"的用户功能,同时print,open,split等是内置的运算符或函数.

这些是什么?它们是真正内置的,语言固有的特性(如C的sizeof运算符)还是它们实际上是main模块的子程序/函数?

如果他们的子程序,有while,for,unless,等也子程序?什么样的运营商+,-,eq等?

ike*_*ami 27

print,open,split不子程序.它们不会导致子调用.他们甚至不存在于符号表(main::或其他方式,虽然你可以把它们称为CORE::split等),和一个不能得到他们的代码的引用(尽管正在开展工作的为他们创造在代理潜艇CORE::,因为当你想把它们视为子程序).他们就像运营商一样+.

$ perl -MO=Concise,-exec -e'sub f {} f()'
1  <0> enter 
2  <;> nextstate(main 2 -e:1) v:{
3  <0> pushmark s
4  <#> gv[*f] s
5  <1> entersub[t3] vKS/TARG,1      <--- sub call
6  <@> leave[1 ref] vKP/REFC
-e syntax OK

$ perl -MO=Concise,-exec -e'split /;/'
1  <0> enter 
2  <;> nextstate(main 1 -e:1) v:{
3  </> pushre(/";"/) s/64
4  <#> gvsv[*_] s
5  <$> const[IV 0] s
6  <@> split[t2] vK                 <--- not a sub call
7  <@> leave[1 ref] vKP/REFC
-e syntax OK

$ perl -MO=Concise,-exec -e'$x + $y'
1  <0> enter 
2  <;> nextstate(main 1 -e:1) v:{
3  <#> gvsv[*x] s
4  <#> gvsv[*y] s
5  <2> add[t3] vK/2                 <--- Just like this
6  <@> leave[1 ref] vKP/REFC
-e syntax OK
Run Code Online (Sandbox Code Playgroud)

它们以各种名称而闻名:

  • 内置功能
  • 功能
  • 内建
  • 命名运营商

大多数被认为是以下之一:

  • 列表运算符
  • 命名一元运算符

子程序通常称为函数(因为它们在C和C++中),因此"函数"是一个含糊不清的单词.这种含糊不清似乎是您问题的基础.


至于while,for,unless,等,他们是通过"流量控制语句"的关键字

while (f()) { g() }
Run Code Online (Sandbox Code Playgroud)

和"声明修饰语"

g() while f();
Run Code Online (Sandbox Code Playgroud)


tch*_*ist 11

Perl关键字是regen/keywords.plPerl源代码分发中的文件中定义的关键字.这些是:

__FILE__,__LINE__,__PACKAGE__,__DATA__,__END__,AUTOLOAD,BEGIN,UNITCHECK,CORE,破坏,END,INIT,CHECK,ABS,接受报警,并ATAN2,绑定,binmode,祝福,休息,来电,CHDIR,输入chmod,格格,印章,CHOWN,CHR,chroot环境,关闭,closedir,CMP,连接,请继续,COS,隐窝,dbmclose,dbmopen,默认情况下,定义,删除,死,做,转储,每个,否则,ELSIF endgrent,endhostent, endnetent,endprotoent,endpwent,endservent,EOF,当量,EVAL,EXEC,存在,退出,EXP,的fcntl,的fileno,羊群,对,的foreach,叉,格式,formline,GE,GETC,getgrent,getgrgid,getgrnam,gethostbyaddr, gethostbyname,gethostent,getlogin,getnetbyaddr,getnetbyname,getnetent,getpeername,getprrp,getppid,getpriority,getprotobyname,getprotobynumber,getprotoent,getpwent,getpwnam,getpwuid,getservbyname,getservwport,getservent,getsockname,getsockopt,given,glob,gmtime,goto, grep,gt,hex,if,index,int,ioctl,join,keys,kill,last,lc,lcfirst,le,length,link,listen,local,localtime,lock,日志,LSTAT,LT,男,地图,MKDIR,了msgctl,msgget,msgrcv,的msgsnd,我,NE,未来,不,不,华侨城,开放,执行opendir,或者,ORD,我们,包,包,管,流行, POS,打印,printf的,原型,推,q,QQ,QR,quotemeta,QW,QX,RAND,读,READDIR,readline的,的readlink,readpipe,recv的,重做,ref时,重命名,需要,复位,返回,反向, rewinddir,rindex,rmdir,s,say,scalar,seek,seekdir,select,semctl,semget,semop,send,setgrent,sethostent,setnetent,setpgrp,setpriority,setprotoent,setpwent,setservent,setsockopt,shift,shmctl,shmget, shmread,shmwrite,shutdown,sin,sleep,socket,socketpair,sort,splice,split,sprintf,sqrt,srand,stat,state,study,sub,substr,symlink,syscall,sysopen,sysread,sysseek,system,syswrite,告诉,telldir,领带,捆绑,时间,次,tr,截断,uc,ucfirst,umask,undef,除非,取消链接,解压缩,unshift,解开,直到,使用,utime,值,vec,等待,waitpid,wantarray,警告,何时,同时,写,x,xor,y.

perlsyn,perlop得到perlsub联机手册必读,由或许跟着perlfunc手册页.要了解如何覆盖与对象一起使用的内置运算符,请参阅重载手册页.

  • @Raphael:你可能认为关键字是无法覆盖的东西,比如`if`和`unless`.**Perl有*极少数*绝对不可侵犯的关键字.**来自`regen/keywords.pl`的大多数Perl关键字确实可以通过三种方式中的一种(或多种)覆盖:通过导入该名称的函数从另一个包(如`chdir`或`open`)或者通过绑定(如`keys`或`pop`)或运算符重载(如`print`,`cmp`或`qq`).哪个需要使用该语言的经验才能理解. (3认同)