在调用子程序时有时会看到子程序前面用一个与号(&),有时又没有,似乎也没什么不对。那用和不用又有什么区别呢?
在老版本的 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";
}
所以,一般情况下,如果不怎么放心,那最好还是加个 '&' 号吧。 |