我正在阅读Simon的http://learn.perl.org/books/beginning-perl/,在第8章-子例程中,他说“子例程”是用户函数,而print、open、split等是内置的运算符或函数。
他们是什么?它们实际上是内置的语言内部特性(比如C的sizeof操作符),还是实际上是main模块的子程序/函数?
如果它们是子程序,那么while、for、unless等也是子程序吗?+,-,eq等运营商呢?
发布于 2011-08-23 21:36:31
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他们有各种各样的名字:
其中大多数被认为是下列之一:
子例程通常被称为函数(在C和C++中是这样),所以“函数”是一个不明确的词。这个模棱两可的问题似乎是你问题的基础。
对于while、for、unless等,它们是流控制语句使用的关键字。
while (f()) { g() }和语句修饰符
g() while f();发布于 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手册。若要了解如何重写与对象一起使用的内置运算符,请参阅重载手册。
发布于 2011-08-23 21:37:55
内置操作符不是Perl子程序。例如,
#!/usr/bin/perl
use strict;
use warnings;
sub Foo { print "In foo\n"; }
my $ref;
$ref = \&Foo;
$ref->();
$ref = \&print;
$ref->();第一个$ref->();是一个间接调用;它打印"In foo“。
第二个问题提出了一个警告:
Undefined subroutine &main::print called at ./tmp.pl line 14因为print不是子例程的名称。
https://stackoverflow.com/questions/7167599
复制相似问题