找回密码
 注册
查看: 2330|回复: 0

perl语言中的省略符号&

[复制链接]
发表于 2011-11-13 22:34:17 | 显示全部楼层 |阅读模式
有几条规则确定在调用子程序时是否可以省略掉&。如果编译器在调用之前知道此子程序的定义,或者Perl 从语法中能知
道这是一个子程序调用,则子程序前的符号&是可以省略的,像使用内嵌(built-in)函数一样(这些规则后有一个特例,将在
下面了解到)。
这意味着如果Perl 能通过语法就能判断其是否为子程序调用,那将非常方便。例如,如果用括号将一些参数括起来,那其
为函数◆调用:
◆在下例中,其调用的子程序为&shuffle。但它可能是一个内嵌的函数。
my @cards = shuffle(@deck_of_cards); # &是不必要的
如果Perl 内部的编译器知道此子程序的定义,则可以省掉其参数的括号:
sub division{
$_[0] / $_[1]; #第一个参数除以第二个参数
}
my $quotient = division 355, 113; #可以省略掉括号
上述代码能正常运行,因为如果加上括号不能改变其含义,那括号就是可选的。
但不要将上述子程序的声明放在调用函数的后面,否则编译器不知道调用division 是什么意思。编译器需在调用前知道其
定义,那样就可以将它当作内嵌(built-in)的函数看待了。
上述并非其特别的地方。特别的地方为:如果子程序和Perl 一个内嵌程序同名,则必须使用&来调用它。编译器将在调用
之前检查其定义,而非直接将它当作内嵌的函数来处理。加上&,可以确保你调用了此子程序;不加,则仅当没有同名的内
嵌函数时才能调用到它:
sub chomp {
print “Munch, Munch!\n”;
}
&chomp; #此处的&是必须的
如果没有&,我们将调用内嵌的函数chomp,虽然已经定义了子程序&chomp。因此,实际的使用规则是:除非知道Perl 所
有的内嵌函数,否则函数调用时都应当使用&。这即是说在你头几百个程序都应当使用&。但如果你看到某人的代码中省略
掉了&,这并非一定是错误;可能他们知道Perl 没有具有相同名字的内嵌函数◆。当程序员打算调用其自己的子程序和调
用内嵌的(built-in)函数一样时,通常是写模块(modules),经常使用原形(prototypes)来告诉Perl 预期的参数类型。创
建模块是一种高级技术;当你准备好时,可以参看Perl 的关于子程序原型(subtoutine prototypes)和创建模块(making modules)
的文档(特别是perlmod 和perlsub 两份文档)。
◆当然,他们也可能犯错误;你可以搜索perlfunc 和perlop 的用户手册来查看其是否为某个内嵌函数的名字。当把警告(warnings)打开时,
Perl 会提示你这种问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-22 01:11 , Processed in 0.030966 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表