首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是Perl内置运算符/函数?

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

Stack Overflow用户
提问于 2011-08-23 21:11:32
回答 4查看 1.8K关注 0票数 14

我正在阅读Simon的http://learn.perl.org/books/beginning-perl/,在第8章-子例程中,他说“子例程”是用户函数,而printopensplit等是内置的运算符或函数。

他们是什么?它们实际上是内置的语言内部特性(比如C的sizeof操作符),还是实际上是main模块的子程序/函数?

如果它们是子程序,那么whileforunless等也是子程序吗?+-eq等运营商呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-23 21:36:31

printopensplit不是子程序。它们不会导致子呼叫。它们甚至不存在于符号表中(在main::中或其他情况下,尽管您可以将它们称为CORE::split等),而且您无法获得对它们代码的引用(尽管您希望将它们作为子程序处理时,正在为它们在CORE::中为它们创建代理子程序)。他们和+一样是运营商。

代码语言:javascript
运行
复制
$ 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

他们有各种各样的名字:

  • 内建函数
  • 函数
  • 内建
  • 命名算子

其中大多数被认为是下列之一:

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

子例程通常被称为函数(在C和C++中是这样),所以“函数”是一个不明确的词。这个模棱两可的问题似乎是你问题的基础。

对于whileforunless等,它们是流控制语句使用的关键字。

代码语言:javascript
运行
复制
while (f()) { g() }

和语句修饰符

代码语言:javascript
运行
复制
g() while f();
票数 27
EN

Stack Overflow用户

发布于 2011-08-23 21:35:21

Perl关键字是在Perl源发行版中的regen/keywords.pl文件中定义的关键字。它们是:

__FILE__,__LINE__,__PACKAGE__,__DATA__,__END__,AUTOLOAD,BEGIN,UNITCHECK,CORE,delete,END,INIT,CHECK,abs,accept,__END__,atan2,bind,binmode,祝福,__DATA__,__END__,chomp,chop,chown,chr,chroot,close,close,cmp,connect,C续,cos,crypt,dbmclose,dbmopen,默认,定义,删除,死,do,转储,每一个,其他,elsif,break,endhostent,endnetent,endhostent,endnetent,-)lcfirst,le,length,link,listen,local,localtime,lock,log,lstat,lt,m,map,mkdir,msgctl,msgget,msgrcv,msgsnd,my,ne,next,no,not,oct,open,opendir,or,ord,our,pack,package,pop,pos,print,printf,prototype,push,q,qq,qr,quotemeta,qw,qx,rand,readdir,readdir,readline,readlink,read导管,recv,redo,ref,rename,reset,readdir,索引,ref,s,例如,标量、查找、查找、选择、半tie、shmget、semop、发送、setgrent、setho支架、setnetent、setpgrp、set优先级、setpwent、setpgrp、setservent、setsockopt、shift、shmctl、shmget、shmread、shmwrite、shmwrite、sin、睡眠、套接字对、排序、拼接、拆分、sprintf、sqrt、srand、stat、state、sub、substr、unlink、syscall、sysopen、sysread、sysopen、system、syswrite、tell、telldir、tie、绑定、时间、r、t、t、undef、undef、undef、undef、undef、untie、undef。直到,使用,utime,值,vec,等待,等待,任意数组,警告,当,同时,写,x,xor,y。

perlsyn、perlop和perlsub命令页是必需的,后面可能是perlfunc手册。若要了解如何重写与对象一起使用的内置运算符,请参阅重载手册。

票数 11
EN

Stack Overflow用户

发布于 2011-08-23 21:37:55

内置操作符不是Perl子程序。例如,

代码语言:javascript
运行
复制
#!/usr/bin/perl

use strict;
use warnings;

sub Foo { print "In foo\n"; }

my $ref;

$ref = \&Foo;
$ref->();

$ref = \&print;
$ref->();

第一个$ref->();是一个间接调用;它打印"In foo“。

第二个问题提出了一个警告:

代码语言:javascript
运行
复制
Undefined subroutine &main::print called at ./tmp.pl line 14

因为print不是子例程的名称。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7167599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档