曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3405|回复: 0
打印 上一主题 下一主题

子程序前的“与号“( & )

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-9-24 17:27:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调用子程序时有时会看到子程序前面用一个与号(&),有时又没有,似乎也没什么不对。那用和不用又有什么区别呢?

在老版本的 Perl 上,如果编译器在调用子程序之前看到子程序的定义,或者说 Perl 可以从语法上识别它就是子程序调用,那么该子程序就可以像内置函数那样在调用时前面无需有 ”与号“ ;反之编译器就不能直接这么调用函数。


如果程序里的子程序恰好和内置函数重名了,那么没有”与号“的调用,会调用到内置函数上,而不会调用自定义的子函数,如下所示:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

sub chomp {
        print "Hello Perl \n"
}

chomp();

运行上面程序不会看到有什么结果,也就是说调用 chomp() 不会调用自动以的那个 chomp(),而是系统内置的 chomp() 。要想输出 Hello Perl ,那么必须在底下的 chomp() 前面加上 ‘&’ 号,即 &chomp(); 。

还有一种情况,比如当该函数为某个函数的参数时,它也需要添加 '&' ,如下面情况:
[code=perl]#!/usr/bin/perl

sub hello {
        print "hello perl!\n";
}

hello if defined hello;[/mw_shl_code]
此时会连续输出两行 "hello perl!" ,但这并不是我们的本意,因为 defined 函数后面,我们只是想判断一下 hello 这个函数是否定义,而不是去执行它,此时 defined 函数后面的函数应该在前面添加 '&' 符号,所以需要改写成:hello if defined &hello;

如果函数的参数列表为空(null),即函数后面跟着一个空括号,那么可以不在函数面前使用 ’&‘ 符号,如:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

sub hello {
        print "hello perl!\n";
}
hello();


还有,行前引用(forward reference) 时也不需要添加 '&' 符号。向前引用的意思是,函数定义体在调用之后,但已经事先做了声明,如在 C 语言中在 main() 函数之前声明了函数的原型,而在 main() 函数体后具体定义了函数的实现,这种情况就叫向前引用。如:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

sub hello;

hello();

sub hello {
        print "hello perl!\n";
}


所以,一般情况下,如果不怎么放心,那最好还是加个 '&' 号吧。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-6-2 13:25 , Processed in 0.076239 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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